同事在做数据报表的时候,由于查询的表很多,关联的字段很多.所有在查询数据的时候一定要考虑性能和查询速度.
我们查询数据的时候,大家都知道如果有索引都会查询会很快的.如果一个字段是索引,则mysql会建一张索引表.就相当一本书的目录.
select a.name from user a where a.id=1.如果id不是索引,那么查义的时间与id是索引有区别的,这里只有一张表看不出来.
select a.name from user a left join user_temp b on a.id=b.id;
这里如果b.id不是索引,查询的速度两个表的大小决定,如果a表大小为100行,而b表有100000,则查询的时间将是一分多钟(本人测试过),
这我分析一下:由于是左连,a表的每条id会去与b表所有的id比较,结果比较的次数为100*100000次.
如果是这样,select a.name form user a ,user_temp b where a.id=b.id
或select a.name form user a inner joun user_temp b on a.id=b.id
这两条是相等的,查询的时间会比左连接快.但这两条查询她很慢.
原因:a表的每个id,只要在b表找到与他相等的id,就会结束,所以次数少于100*100000
如果b表的id是索引,则查询的速度与上面的比较(根据两个表越大,越能体现出来).
有时候我们都会为一些常要查询条件作为索引.但也要考虑索引会不会失
在做数据报表的时候,查询的条件会很多,关联的表也为很多,子查询也非常的多.
如果两个子查询关联,来查询,那么,查询条件的索引就会失效.那么查询就如上面那样.
select a.name ,b.passwrd form A a left join B b on a.name=b.name.
这条查询,a,b的name我都设置了索引(A表为10000,B表为1000),我查询的时间很慢.
于是用explain select a.name ,b.passwrd form A a left join B b on a.name=b.name.
发现没有索引.也就是说索引失效.最后查看两个表的时候,发现A.name为gbk,B.name为utf-8,于是把b.name改为utf-8.就行.得出.如果比较的查询条件,如果为字符型的时候要注意编码是否一致.
分享到:
相关推荐
Mysql查询流程分析,简单易懂,附加一些个人的理解,希望能帮助到大家
mysql查询分析器 。
mySQL查询分析器 j简单的JDS小程序,学习程序!
InnoDB 查询优化实现分析 -- MySQL
MySQL 加锁处理分析 MySQL 加锁处理分析 MySQL 加锁处理分析
五款常用mysql slow log分析工具分析比较
mysql 查询本周、上周、本月、上个月份的数据 mysql 查询本周、上周、本月、上个月份的数据 mysql 查询本周、上周、本月、上个月份的数据
mysql可以查询根据某列按条件统计总数
MySQL加锁处理分析@何登成1
mysql 树形结构查询,使用存储过程,实现mysql的树形结构查询
何登成 资深技术专家 阿里巴巴数据库内核团队负责人 深入MySQL加锁处理分析
这是一个PHP+MYSQL的中学成绩查询分析系统,本机安装了下,完全可用,写的很好,能满足平常的需要,有能力的用户可以在此基础上进一步开发。
MySQL Sending data导致查询很慢的问题详细分析 sphinx支持倒排索引,但sphinx从mysql查询源数据的时候,查询的记录4~5分钟左右 show processlist查看sql语句执行状态,查询结果如下
基于Docker的MySQL数据库性能分析.pdf
Mysql 时间模糊查询,不同场景的查询方式,根据条件查询
MySQL_源码分析
本白皮书将会探讨一些用户案例,并描述开发人员和MySQL支持人员面临的挑战。...白皮书中也介绍了MySQL 企业版监控器的新特性,查询分析器,并且还描述查询分析器在开发和生产环境中是如何调整和优化SQL代码的。
mysql中有种可以通过join相关操作进行表与表之间的方式查询不同结果集,但是在一对多的情况下,关键查询的结果是多条的.例如:班级和学习的关系,我想很直观的看到班级和学生的情况,列表显示出班级的信息和班级的男生...