设为首页 收藏本站
查看: 535|回复: 0

[经验分享] MySQL教程建立索引的几个准则 怎样建索引更有效!

[复制链接]

尚未签到

发表于 2016-10-23 06:41:13 | 显示全部楼层 |阅读模式
关于建立索引的几个准则:



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  ORDER BY [sort] LIMIT [offset],[LIMIT];





这个SQL语句优化比较简单,在[sort]这个栏位上建立索引即可。



2、WHERE + ORDER BY + LIMIT组合的索引优化,形如:



SELECT [column1],[column2],.... FROM  WHERE [columnX] = [value] ORDER BY [sort] LIMIT[offset],[LIMIT];





这个语句,如果你仍然采用第一个例子中建立索引的方法,虽然可以用到索引,但是效率不高。更高效的方法是建立一个联合索引(columnX,sort)



3、WHERE + IN + ORDER BY + LIMIT组合的索引优化,形如:



SELECT [column1],[column2],.... FROM  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  WHERE [columnX]=[value1] ORDER BY [sort] LIMIT[offset],[LIMIT]

UNION

SELECT [column1],[column2],.... FROM  WHERE [columnX]=[value2] ORDER BY [sort] LIMIT[offset],[LIMIT]

UNION

……





但经验证,这个方法根本行不通,效率反而更低,测试时对于大部分应用强制指定使用排序索引效果更好点



4、不要再WHERE和ORDER BY的栏位上应用表达式(函数),比如:



SELECT * FROM  ORDER BY YEAR(date) LIMIT 0,30;





5、WHERE+ORDER BY多个栏位+LIMIT,比如



SELECT * FROM  WHERE uid=1 ORDER x,y LIMIT 0,10;





对于这个语句,大家可能是加一个这样的索引(x,y,uid)。但实际上更好的效果是(uid,x,y)。这是由MySQL处理排序的机制造成的。



以上例子你在实际项目中应用的时候,不要忘记在添加索引后,用EXPLAIN看看效果。





另外注意:

索引的字段类型要一致

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289941-1-1.html 上篇帖子: 用于MySql数据库的MySqlHelper.cs类,及其调用例子 下篇帖子: (转)mysql isam的插入效率比innodb的要高
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表