高性能mysql 小查询_高性能MySql进化论(十一):常见查询语句的优化
总结一下常见查询语句的优化方式
1 COUNT
1. COUNT的作用
· COUNT(table.filed)统计的该字段非空值的记录行数
· COUNT(*)或者是COUNT(not nullable field) 统计的是全表的行数
如果要是统计全表记录数,COUNT(*)效率会比COUNT(not nullable field)要高一点
2. MYISAM的COUNT
一般执行COUNT操作时需要扫描大量的记录,但是在MyISAM引擎的数据库中,数据库把表的记录数保存起来,所以COUN(*)会非常的快(前提是不包含where条件)
3. 当需要频繁的使用COUNT时,可以考虑使用汇总表的策略
4. 优化小例子
在MYISAM中进行范围查询时,可以减少检索行数的小技巧
原始的:select count(*) from dictionary where id>5.
优化后:select (select count(*) fromdictionary)-count(*) from dictionary where id<=5
减少查询次数
优化前:需要两条语句
Select count(*)from student where area=’SH’
Select count(*)from student where area=’BJ’
优化后:合并成一条
select count(area='SH') as shcount, count(area='BJ') as bjcount from student;
2 优化关联查询
1. 确保ON或USING的字句上有索引
2. 一般情况下只需要在第二个表上创建索引
3. 尽量使 Group by/Order by的表达式中只包含一个表的字段
3 优化子查询
尽量用关联代替子查询
4 优化Group by 以及Distinct
1. 当对关联查询执行group by操作时,使用查询表的标识列作为分组条件效率会比较高
2. 当需要查询的非group by指定的字段时,正常情况下是无法执行的,可以通过inner join 的形式来弥补
select firstname, lastname
from actor
inner join(select actor_id, count(*) as cnt from actor group by(actor_id))
using (actor_id)
3. group by默认会对查询的结果进行排序,数据量很大的时候可能会比较耗资源,如果你不关心查询结果的顺序,可以通过order by null 避免这种不必要的浪费
5 LIMIT分页
在进行分页查询的时候往往是采用select * from table1 limit 100,20 的方式来提取数据,在处理的过程中会读取120条数据,然后扔掉100条的offset记录,最后返回20条记录给客户端。如果offset的值非常大,效率上可能会有影响,可以尝试
1. 可以通过覆盖索引+inner join的方式来重写sql
select field1,field2,field3
from table1
inner join
(select id from table1 limit 100, 20) as temp
using(id)
2. 如果可以计算出明确的开始点和结束点,可以转换成 between and 的方式,这种方式只会扫描指定的行数,效率比较高
Select * from table1 between 100 and 120.
3. 可以通过位置标签的方式,来减少需要检索的记录数
例如 从某个位置开始。 Select * from table1 whereid>100 limit 20
下图列出了三种方式的效率对比
在进行分页处理的时候往往需要知道记录的总数,然后用这些总数生成页码。获取总数往往是使用count或是伴随一次全表查询得到的,这个过程也是检索所有的记录,然后再丢掉。为了避免这种浪费可以采取两种策略
· 把页码换成“下一页”的方式,这样就只需要去取固定的条数
· 一次性读取1000条,当一千条使用完后,采用“获取更多记录”的方式再获取1000条
6 UNION
· Union操作会对处理后的结果执行distinct操作,这在很多时候是没有必要的。可以采用union all来避免这个问题
7 自定义变量
合理灵活的使用自定义变量往往会给程序的性能带来意想不到的效果,但往往也会带来与其他数据库系统的兼容性问题。
下面列出几个自定义变量使用的小例子
· 行号
mysql> set @rownumber:=0;
mysql> select mean, @rownumber:=@rownumber+1 from dictionary limit10;
· 避免重复查询刚刚更新的数据
在更新完一条记录后,往往需要再次执行select查询刚刚更新过的记录
通过变量可以避免这种问题
Mysql>set @updaterow:=null;
mysql> update dictionary set mean='update get variable' where id=100and @updaterow:=now();
· 统计更新和插入的数量
mysql> set @x:=0; //define avariable
mysql> insert into dictionary (id,mean) values(3,'duplicate') onduplicate key update mean=values(mean)+(0*(@x:=@x+1)); //insert a duplicaterecord
mysql> select @x; //get x value, it’s indicator duplicate times
8 静态分析工具
有时候可以借助专门的查询分析工具来发现自己的问题,比如pt-query-advisor(http://www.percona.com/doc/percona-toolkit/2.1/pt-query-advisor.html)
高性能mysql 小查询_高性能MySql进化论(十一):常见查询语句的优化相关推荐
- MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结
MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...
- 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)
一.分析原因 SQL语句慢查询的原因有多种,如: 1)数据方面: 需要查询的表数据量太大导致性能下降: 是否向数据库请求了不需要的数据行或数据列: MySQL是否在扫描额外的记录 2)SQL语句太过于 ...
- 高性能mysql看不懂_高性能mysql笔记1
转载请注明:TheViper http://www.cnblogs.com/TheViper <>这本书写的真的很好,只可惜本屌不才,大部分都看不懂,暂且记下与mysql优化有关,对自己有 ...
- 高性能mysql总结笔记_高性能MySQL第三本笔记总结(上)
无论何时,只要有多个查询需要在同一个时刻修改数据时,就会有并发问题.MySql主要在服务器层与存储引擎层进行并发控制. 假设数据库中国一张邮箱表,每个邮件都是一条记录.如果某个客户正在读取邮箱,同时其 ...
- mysql 主主结构_高性能mysql主主架构
(3)配置参数说明 server-id:ID值唯一的标识了复制群集中的主从服务器,因此它们必须各不相同.master_id必须为1到232–1之间的一个正整数值,slave_id值必须为2到232–1 ...
- c 编程 mysql结果集_使用mysql C语言API编写程序—MYSQL数据库查询操作(执行查询操作,获取查询结果的字段数,记录行数,...
//MYSQL_RES保存查询结构 MYSQL_RES* result_ = NULL; int error_code = 0; //保存错误码 char error_info[1024] = '\0 ...
- B+树 范围查询_为什么 MySQL 使用 B+ 树,而不是 B 树或者 Hash?
Java技术栈 www.javastack.cn 关注优质文章 为什么 MySQL 使用 B+ 树是面试中经常会出现的问题,很多人对于这个问题可能都有一些自己的理解,但是多数的回答都不够完整和准确.大 ...
- mysql怎么子查询_在mysql中如何进行子查询?
在mysql中,子查询是指将一个查询语句嵌套在另一个查询语句中,可以在SELECT.UPDATE和 DELETE语句中配合WHERE子句进行实现,WHERE子句中语法格式为"WHERE (另 ...
- mysql 分组联合查询_【MySQL】-2 函数、分组、子查询、联合查询
函数 Mysql的函数特性没有SQL可移植性强. 大多数情况下支持的函数: 处理文本串的函数: RTrim():处理列值右边的空格 LTrim():处理列值左边的空格 Trim():处理列值的左右两边 ...
最新文章
- 解决putty中文乱码并远程访问linux界面功能
- 使用AD9833谐波发送调频广播
- VTK修炼之道47:图形基本操作进阶_法向量计算
- boost::geometry:::detail::overlay::get_clusters用法的测试程序
- SAP Spartacus B2B Unit List跳转到Unit Detail页面的路由执行逻辑
- 亦云小组KTV点歌系统简介
- python定义字体颜色_windows print 自定义字体颜色【python】
- Docker部署SpringBoot的两种方法,后一种一键部署超好用!
- 玖云个人导航API工具网站源码
- java生命游戏并行_Java架构--线程的发展历史
- java 毕向东 内部类_毕向东视频学习笔记【Java_Day10 多态+内部类】
- Android 拍照、选择图片并裁剪
- 微信开放平台开发者认证
- LiveNVR监控流媒体Onvif/RTSP功能支持海康摄像头通过海康SDK的方式接入直播观看录像回看预置位操作
- 网站浏览计数器html,Web浏览计数器的设计应用
- Chemical Space Docking | 定义下一代虚拟筛选技术
- jsp未正确拼写字 mysql_(转)MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结...
- 引文分析工具HistCite Pro与CiteSpace的安装
- 爬虫之cookie处理
- 贝尔实验室创立 90 多年终于出了一本书,带你探秘未来网络
热门文章
- Linux命令行性能监控工具大全
- java 对象复制字段_利用Java反射机制实现对象相同字段的复制
- mysql导入xml 工具下载_XML导入Mysql工具下载|XmlToMysql 最新版v2.1 下载_当游网
- unity 使用mysql实现登录注册_用mysql实现登录注册功能
- linux课堂笔记(8)
- r和matlab学哪个,初学者求教‘r*’是什么意思啊
- Nginx(四):负载均衡Load balancing
- Albert launcher安装与使用
- go之树型结构深度理解补充
- 人生中最【无用】的二十件事