<b>通过索引优化含ORDER BY的MySQL语句</b>[MySQL防范]
本文“<b>通过索引优化含ORDER BY的MySQL语句</b>[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于成立索引的几个原则:
1、公道的成立索引可以加快数据读取效率,不公道的成立索引反而会拖慢数据库的呼应速度.
2、索引越多,更新数据的速度越慢.
3、尽大概在采取MyIsam作为引擎的时刻利用索引(因为MySQL以BTree存储索引),而不是InnoDB.但MyISAM不支持Transcation.
4、当你的程序和数据库构造/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺利办理,那就是应当考虑利用诸如memcached这样的分布式缓存系统的时刻了.
5、习惯和逼迫自己用EXPLAIN来解析你SQL语句的性能.
一个很简单犯的错误:
不要在挑选的栏位上安排索引,这是无意义的.应当在条件挑选的语句上公道的安排索引,比方where,order by.
例子:
SELECT id,title,content,cat_id FROM article WHERE cat_id = 1;
上面这个语句,你在id/title/content上安排索引是毫无意义的,对这个语句没有任何优化作用.但是假如你在外键cat_id上安排一个索引,那作用就相当大了.
几个常用ORDER BY语句的MySQL优化:
1、ORDER BY + LIMIT组合的索引优化.假如一个SQL语句形如:
SELECT [column1],[column2],.... FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT]; |
这个SQL语句优化对比简单,在[sort]这个栏位上成立索引便可.
2、WHERE + ORDER BY + LIMIT组合的索引优化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] LIMIT[offset],[LIMIT]; |
这个语句,假如你仍旧采取第一个例子中成立索引的办法,固然可以用到索引,但是效率不高.更高效的办法是成立一个结合索引(columnX,sort)
3、WHERE + IN + ORDER BY + LIMIT组合的索引优化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] IN ([value1],[value2],...) ORDER BY[sort] LIMIT [offset],[LIMIT]; |
这个语句假如你采取第二个例子中成立索引的办法,会得不到预期的效果(仅在[sort]上是using index,WHERE那边是using where;using filesort),来由是这里对应columnX的值对应多个.
这个语句怎么优化呢?我暂时没有想到什么好的办法,看到网上有便宜供应的办法,那就是将这个语句用UNION分拆,然后成立第二个例子中的索引:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value1] ORDER BY [sort] LIMIT[offset],[LIMIT] UNION SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value2] ORDER BY [sort] LIMIT[offset],[LIMIT] UNION …… |
但经考证,这个办法根本行不通,效率反而更低,测试时关于大部份利用强迫指定利用排序索引效果更好点
4、不要再WHERE和ORDER BY的栏位上利用表达式(函数),比方:
SELECT * FROM [table] ORDER BY YEAR(date) LIMIT 0,30; |
5、WHERE+ORDER BY多个栏位+LIMIT,比方
SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10; |
关于这个语句,大家大概是加一个这样的索引(x,y,uid).但实际上更好的效果是(uid,x,y).这是由MySQL处理排序的机制造成的.
以上例子你在实际项目中利用的时刻,不要忘掉在增添索引后,用EXPLAIN看看效果.
以上是“<b>通过索引优化含ORDER BY的MySQL语句</b>[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |