2019独角兽企业重金招聘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 *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。

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

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

  1. 小蚂蚁学习mysql性能优化(4)--SQL以及索引优化--具体一些优化方法

    2019独角兽企业重金招聘Python工程师标准>>> max()的优化 例如:explain select max(`payment_date`)  from payment; 可 ...

  2. php连接数据库配置优化,小蚂蚁学习mysql性能优化(9)--操作系统配置优化--mysql配置文件优化...

    操作系统配置优化 数据库是基于操作系统的,目前大多数mysql都是安装在linux系统之上,所以对于操作系统的一些参数配置也会影响到mysql的性能 网络方面的配置修改    \etc\sysctal ...

  3. 小蚂蚁学习mysql性能优化(8)--数据库结构优化--范式化和反范式化,水平分表,垂直分表...

    2019独角兽企业重金招聘Python工程师标准>>> 范式化和反范式化 范式化是指数据库设计的规范,目前说到范式化一般是指第三设计范式,也就是要求数据表中不存在非关键字段对任意候选 ...

  4. oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...

    本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...

  5. 【MySQL之MySQL底层分析篇】系统学习MySQL,从应用SQL语法到底层知识讲解,这将是你见过最完成的知识体系

    文章目录 MySQL体系结构 MySQL存储结构(以InnoDB为例) MySQL执行流程(以InnoDB为例) 1. 数据写入原理 2. 数据查询原理 MySQL存储引擎 1. 为什么需要不同的存储 ...

  6. sql性能分析以及sql语句的优化

    sql性能分析的几种方式 SQL执行频率 show [session|global] status like 'com__(七个下划线)_';可以查看当前数据库的INSERT.UPDATE.DELET ...

  7. Mysql查看状态,连接数,线程数以及Mysql性能监控工具doDBA的使用以及优化

    解决问题: 怎样查看Mysql最大连接数(max_connections)?怎样修改max_connections? 怎样查看Mysql线程缓存池数量(thread_cache_size)?threa ...

  8. Mysql常用30种SQL查询语句优化方法

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  9. MySQL 常用30种SQL查询语句优化方法

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及 ...

最新文章

  1. Google发布机器学习术语表 (中英对照)
  2. SAP PM 初级系列8 - PM 组织架构
  3. 一文掌握RNA seq,RNA seq课程大汇总
  4. Spark on Yarn:任务提交参数配置
  5. C语言 文件操作9--fgetc()和fputc()
  6. Spark Structure Streaming(一)之简介
  7. oracle11g dataguard物理备库搭建
  8. 更新MySQL复制 自动监控脚本
  9. Linux命令速查手册出炉!
  10. 模拟get和post请求(支持自定义header和测试CDN节点)
  11. mysql cluster安装报错
  12. Java打印菱形(一)
  13. linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]
  14. IPv4和IPv6、局域网和广域网、网关、公网IP和私有IP、IP地址、子网掩码、网段、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?
  15. Windows环境下Python中multiprocessing关于RuntimeError异常的处理方式
  16. 苹果6s微信提示未连接服务器,苹果6s微信无法打开,一直显示正在载入怎么处理?...
  17. winform去掉laber背景色
  18. iPhone 5s 如何进入 DFU 模式,macOS 无法进入 DFU 模式
  19. 【问题描述】编写一个程序计算出球、圆柱和圆锥的表面积和体积。
  20. 不平衡学习(Imbalanced learning)

热门文章

  1. flask中的request
  2. 机器学习基础---架构设计
  3. 深入解析Express下采用bcryptjs进行密码加密
  4. 从此以后,江湖有了它的传说!
  5. iOS - OC NSUserDefaults 数据存储
  6. UE把环境变量Path改了
  7. .NET 面试题总结 (附有参考答案) 第1部分
  8. SDUT 2384 El Dorado
  9. [新手学3D]Width 和 Pitch(Direct3D 9)
  10. PyCharm 2018 for mac 数据库实战:链接SQLite、建表、添加、查询数据