小蚂蚁学习mysql性能优化(5)--SQL以及索引优化--须要添加索引的列

在哪些列上添加索引?mysql

1.    一般选择在where从句中,group by从句,order by从句,on从句中出现的列添加索引。
sql

    在一些特殊状况下,还会在select从句中所出现的列进行索引,当一个索引包括了查询中的全部列,那么称这个索引就是覆盖索引,当这个索引执行的频率很是的高,并且查询中所包括的列相对来讲比较少的时候,就会经过覆盖索引的方式对这个sql进行优化。数据库

    目的:使咱们所须要的数据彻底经过索引就可以获取,而不用去查询表的数据。
性能

2.    索引字段越小越好优化

    由于数据库中,数据的存储是以页为单位的,若是在一页中存储的数据越多,一次IO操做获取的数据量就越大,这样对IO效率也会更高一些,因此索引字段是越小越好。
spa

3.    若是是创建联合索引,须要考虑,哪一列放到联合索引的前面最为合适。 索引

    联合索引中会包含多个列,哪个列放到索引前头对咱们的查询优化最好呢?首先就要看哪一列的离散度更高,每每离散度更大的列,它的可选择性就越高,所以放到联合索引的前头效果越好。
效率

    (ノ*・ω・)ノ    那么问题来了,若是判断列的离散度?select

    例如:数据

    select * from payment where staff_id=2 and customer_id=584;

    须要对这条sql创建一个联合索引,那究竟是index(staff_id,customer_id)好呢,仍是index(customer_id,staff_id)好呢?哪个离散程度更好呢,须要执行一个统一的操做,首先查询一下它们的惟一值都有多少个,惟一值越多,说明离散程度越好,可选择性就越高,以下:

    mysql> select count(distinct staff_id),count(distinct customer_id) from payment;

    

    +--------------------------+-----------------------------+

    | count(distinct staff_id) | count(distinct customer_id) |

    +--------------------------+-----------------------------+

    |                        2 |                         599 |

    +--------------------------+-----------------------------+

    1 row in set (0.10 sec)

因而可知,customer_id的韧度更高,可选择性更好,所以,要创建联合索引,就把customer_id放到联合索引的前面,是更好的一种方式。

覆盖索引(covering index)

    MYSQL能够利用索引返回select列表中的字段,而没必要再去读取数据文件。

    包含全部知足查询须要的数据的索引称之为覆盖索引(covering index);

    注意:若是使用覆盖索引,必定要注意select列表中只取出须要的列,不能使用select *,由于若是将全部字段一块儿作索引会致使索引文件过大,查询性能降低。

相关文章
相关标签/搜索