MySQL通过索引优化含ORDERBY的语句
关于建立索引的几个准则:
1、合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度。
2、索引越多,更新数据的速度越慢。
3、尽量在采用MyIsam作为引擎的时候使用索引(因为MySQL以BTree存储索引),而不是InnoDB。但MyISAM不支持Transcation。
4、当你的程序和数据库结构/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺利解决,那就是应该考虑使用诸如memcached这样的分布式缓存系统的时候了。
5、习惯和强迫自己用EXPLAIN来分析你SQL语句的性能。
一个很容易犯的错误:
不要在选择的栏位上放置索引,这是无意义的。应该在条件选择的语句上合理的放置索引,比如where,orderby。
例子:
SELECTid,title,content,cat_idFROMarticleWHEREcat_id=1;
上面这个语句,你在id/title/content上放置索引是毫无意义的,对这个语句没有任何优化作用。但是如果你在外键cat_id上放置一个索引,那作用就相当大了。
几个常用ORDERBY语句的MySQL优化:
1、ORDERBY+LIMIT组合的索引优化。如果一个SQL语句形如:
这个SQL语句优化比较简单,在[sort]这个栏位上建立索引即可。
2、WHERE+ORDERBY+LIMIT组合的索引优化,形如:
这个语句,如果你仍然采用第一个例子中建立索引的方法,虽然可以用到索引,但是效率不高。更高效的方法是建立一个联合索引(columnX,sort)
3、WHERE+IN+ORDERBY+LIMIT组合的索引优化,形如:
这个语句如果你采用第二个例子中建立索引的方法,会得不到预期的效果(仅在[sort]上是usingindex,WHERE那里是usingwhere;usingfilesort),理由是这里对应columnX的值对应多个。
这个语句怎么优化呢?我暂时没有想到什么好的办法,看到网上有便宜提供的办法,那就是将这个语句用UNION分拆,然后建立第二个例子中的索引:
UNION
SELECT[column1],[column2],....FROM[TABLE]WHERE[columnX]=[value2]ORDERBY[sort]LIMIT[offset],[LIMIT]
UNION
……
但经验证,这个方法根本行不通,效率反而更低,测试时对于大部分应用强制指定使用排序索引效果更好点
4、不要再WHERE和ORDERBY的栏位上应用表达式(函数),比如:
5、WHERE+ORDERBY多个栏位+LIMIT,比如
对于这个语句,大家可能是加一个这样的索引(x,y,uid)。但实际上更好的效果是(uid,x,y)。这是由MySQL处理排序的机制造成的。
以上例子你在实际项目中应用的时候,不要忘记在添加索引后,用EXPLAIN看看效果。
相关文章
- MySQL Error number: MY-011304; Symbol: ER_XPLUGIN_SSL_HANDSHAKE_WITH_SERVER_FAILED; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL慢查询优化、索引优化、以及表等优化总结详解数据库
- MySQL:最新精彩版本登场(mysql最新版本)
- 优化MySQL视图的性能表现(mysql视图性能优化)
- 者mysql的性能优化实现SQL Server/MySQL性能优化的9个实用技巧(sqlserver或)
- 什么MySQL:添加索引命令指南(mysql添加索引命令是)
- 深入了解MySQL Int索引,优化数据库查询效率(mysqlint索引)
- MySQL百万数据优化的做法与技巧(mysql百万优化)
- MySQL函数大百科,轻松学习SQL编程(mysql函数大全)
- MySQL索引:种类与应用(mysql索引种类)
- MySQL占用内存优化实践(mysql占用内存)
- 性能优化MySQL分区:实现系统性能优化(mysql分区实现)
- MySQL:优化内存数据库的性能(内存数据库mysql)
- MySQL表性能优化:突破性能瓶颈(mysql表优化)
- 深度探究MySQL数据库读写速度优化技巧(mysql数据库读写速度)
- MySQL多表视图:多个表内容的极速查询(mysql 多表 视图)
- MySQL中属性的含义及作用解析(mysql中什么是属性)
- 利用Bit函数管理MySQL常用工具(bit()mysql)
- cmd突然弹出MySQL及招引事件(cmd突然弹出mysql)
- MySQL的及格率如何评估数据库性能(mysql中及格率)