mysql索引优化
Posted S大好人S
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql索引优化相关的知识,希望对你有一定的参考价值。
这里记录一些看了《高性能mysql》后的一些学习心得
在弄清楚mysql innoDB前要提前了解索引的原理,最基本的要了解磁盘结构与工作方式还有b-tree结构。
加索引的目的:
- 减少服务器执行sql时扫描的数据量
- 避免order by或者group by等操作的时候产生的临时表
- 将随机IO变成顺序IO
评价索引好坏的标准:
- 一星,索引将相关的数据放在一起
- 二星,索引中列的顺序与查询中的列的顺序是一样的
- 三星,索引中的列包含查询中的所有列
设计索引注意事项:
- 多个字段的联合索引要与查询的顺序一致,那么这里就涉及一个问题,在设计查询的时候应该把哪一列做为第一个被查询的字段呢?
e.g.使用如下原则:
这样做的原因:尽量通过btree去找到数据,而不是让第二级变得很大而去遍历,降低算法复杂度
另外一点是通常把查询范围的字段放到索引最后,比如婚恋网站的年龄选项,因为年龄通常是一个范围搜索条件,如果把该字段放到多列索引的中间位置,那么后边的索引就都用不上了。
2. 覆盖索引:使用覆盖所引可以减少回表的次数,因为innoDB里边页子结点存储的是主键值,如果直接把字段值存储到里边那么就不用先找到主键再去通过主键去找值了。
3. 延持关联: 通常如下MySQL需要通过延迟关联来进行优化,(1)表中数据量大(2)先order by再limit m, n。因为符合这亲条件的SQL要先查找N+M行,然后进行排序再查找,效率很低,浪费大量CPU与内存资源
SELECT id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url FROM relation where biz_type =\'0\'
AND end_time >=\'2014-05-29\' ORDER BY id asc LIMIT 149420 ,20;
优化原理是内层SQL先通过覆盖索引找到相应的主键,而不是所有的数据行,这样就大大减少了需要读到内存中的行数,提高了效率。
SELECT a.* FROM relation a, (select id from relation where biz_type =\'0\' AND end_time >=\'2014-05-29\' ORDER BY id asc LIMIT 149420 ,20 ) b where a.id=b.id
4. 重复索引: 应该尽量不用冗余的索引。比如(A,B)这个索引会包含索引A,但是不包含(B,A)与B。但是有的时候为了性能也要同时保留(A,B)与A,因为(A,B)会比A的效率低,当 (A,B)做为A使用的时候
以上是关于mysql索引优化的主要内容,如果未能解决你的问题,请参考以下文章