1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 小蚂蚁学习mysql性能优化(5)--SQL以及索引优化--需要添加索引的列

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

时间:2021-04-14 05:29:11

相关推荐

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

独角兽企业重金招聘Python工程师标准>>>

在哪些列上添加索引?

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

在一些特殊情况下,还会在select从句中所出现的列进行索引,当一个索引包括了查询中的所有列,那么称这个索引就是覆盖索引,当这个索引执行的频率非常的高,而且查询中所包括的列相对来说比较少的时候,就会通过覆盖索引的方式对这个sql进行优化。

目的:使我们所需要的数据完全通过索引就能够获取,而不用去查询表的数据。

2.索引字段越小越好

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

3.如果是建立联合索引,需要考虑,哪一列放到联合索引的前面最为合适。

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

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

例如:

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 *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。