`
bcc123hf
  • 浏览: 47562 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql查询快慢分析

阅读更多
同事在做数据报表的时候,由于查询的表很多,关联的字段很多.所有在查询数据的时候一定要考虑性能和查询速度.

    我们查询数据的时候,大家都知道如果有索引都会查询会很快的.如果一个字段是索引,则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.就行.得出.如果比较的查询条件,如果为字符型的时候要注意编码是否一致.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics