程序员应该如何构建高性能Mysql索引

中科白癜疯医院是骗人的吗 https://m.sohu.com/n/461055589
索引应该是各种数据库优化方案之中成本最低,见效最快的解决方案了,现在就重点讲下:企业级应用如何构建高效索引,以及应该注意些什么。索引类型1、B-tree索引Myisam和innodb中,默认用B-tree索引,是一种平衡树。可以抽象一下---B-tree系统,可理解为排好序的快速查找结构”2、hash索引在memory表里,默认是hash索引,hash的理论查询时间复杂度为O(1)既然hash的查找如此高效,为什么不都用hash索引?1:hash函数计算后的结果,是随机的,没有办法对范围查询进行优化.2:无法利用前缀索引.比如在btree中,field列的值“hellopworld”,并加索引查询xx=helloword,自然可以利用索引,xx=hello,也可以利用索引.(左前缀索引)因为hash(‘helloword’),和hash(‘hello’),两者的关系仍为随机3:排序也无法优化.4:必须回行。就是说通过索引拿到数据位置,必须回到表中取数据以下是建立索引时的注意事项1.索引不是越多越好,单张表中索引数量不宜超过8个合理创建联合索引,(a,b,c)相当于(a)、(a,b)、(a,b,c)禁冗余索引索引是双刃剑,会增加维护负担,增大IO压力。(a,b,c)、(a,b),后者为冗余索引。可以利用前缀索引来达到加速的目的,减轻维护负担2.SELECT只获取必要的字段,不建议使SELECT*好处:减少网络带宽消耗;能有效利用覆盖索引,表结构变更对程序基本无影响3.合理使用覆盖索引减少IO,避免排序4.索引覆盖是指如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据。这种查询速度非常快,称为索引覆盖”理想的索引:1:查询频繁2:区分度高3:长度小4:尽量能覆盖常用查询字段注:主键查询是天然的覆盖索引5.尽量避免用NULL()原因:NULL不利于索引,要用特殊的字节来标注。在磁盘上占据的空间其实更大。6.索引的主键值,应尽量是连续增长的值,而不是要是随机值(不要用随机字符串或UUID),否则会造成大量的页分裂与页移动7.不对过的VARCHAR字段建立索引。建议优先考虑前缀索引,或添加CRC32或MD5伪列并建立索引8.在常用的列上加上适当索引例:wherecat_id=3andprice;//查询第3个栏目,元以上的商品误:cat_id上,和,price上都加上索引.错:只能用上cat_id或Price索引,因为是独立的索引,同时只能用上1个9.多列索引上,索引发挥作用,需要满足左前缀要求以index(a,b,c)为例10.选择区分度大的列建立索引。组合索引中,区分度大的字段放在最前重要SQL必须被索引:update、delete的where条件列、orderby、groupby、distinct字段、多表join字段。11.不建议使用%前导查询,例如:like“%abc”,无法利用到索引。12.不建议使用负向查询,例如notin、!=、notlike。使用EXPLAIN判断SQL语句是否合理使用索引,尽量避免extra列出现:UsingFileSort、UsingTemporary


转载请注明:http://www.aierlanlan.com/rzdk/8331.html

  • 上一篇文章:
  •   
  • 下一篇文章: