博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小蚂蚁学习mysql性能优化(5)--SQL以及索引优化--需要添加索引的列
阅读量:6325 次
发布时间:2019-06-22

本文共 1332 字,大约阅读时间需要 4 分钟。

hot3.png

在哪些列上添加索引?

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

转载于:https://my.oschina.net/woshixiaomayi/blog/513179

你可能感兴趣的文章
Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步
查看>>
SIP业务基本知识
查看>>
fn project 试用之后的几个问题
查看>>
Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)
查看>>
EF基础知识小记四(数据库=>模型设计器)
查看>>
synchronized修饰普通方法,修饰静态方法,修饰代码块,修饰线程run方法 比较
查看>>
docker-ce-17.09 容器创建,运行,进入,删除,导入/导出
查看>>
Tomcat启动log打印到INFO: At least one JAR was scanned for TLDs yet contained no TLD各种解决方式...
查看>>
laravel建立一个分组控制器和分组路由
查看>>
Linux下RocketMQ环境的配置
查看>>
httpclient的理解(代码理解)
查看>>
Shiro学习(一)——Shiro简介
查看>>
异常-----freemarker.template.TemplateException
查看>>
ThreadLocal可能引起的内存泄露
查看>>
Fluxbox 添加Qt应用程序menu
查看>>
如何生动形象、切中要点地讲解 OSI 七层模型和两主机传输过程
查看>>
09-spring学习-资源访问接口
查看>>
adb 环境配置 常用命令 总结
查看>>
.net通过url访问服务器获取服务器返回数据
查看>>
腾讯云中ssL证书的配置安装
查看>>