小蚂蚁学习mysql性能优化(5)--SQL以及索引优化--需要添加索引的列
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以及索引优化--需要添加索引的列相关推荐
- 小蚂蚁学习mysql性能优化(4)--SQL以及索引优化--具体一些优化方法
2019独角兽企业重金招聘Python工程师标准>>> max()的优化 例如:explain select max(`payment_date`) from payment; 可 ...
- php连接数据库配置优化,小蚂蚁学习mysql性能优化(9)--操作系统配置优化--mysql配置文件优化...
操作系统配置优化 数据库是基于操作系统的,目前大多数mysql都是安装在linux系统之上,所以对于操作系统的一些参数配置也会影响到mysql的性能 网络方面的配置修改 \etc\sysctal ...
- 小蚂蚁学习mysql性能优化(8)--数据库结构优化--范式化和反范式化,水平分表,垂直分表...
2019独角兽企业重金招聘Python工程师标准>>> 范式化和反范式化 范式化是指数据库设计的规范,目前说到范式化一般是指第三设计范式,也就是要求数据表中不存在非关键字段对任意候选 ...
- oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...
本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...
- 【MySQL之MySQL底层分析篇】系统学习MySQL,从应用SQL语法到底层知识讲解,这将是你见过最完成的知识体系
文章目录 MySQL体系结构 MySQL存储结构(以InnoDB为例) MySQL执行流程(以InnoDB为例) 1. 数据写入原理 2. 数据查询原理 MySQL存储引擎 1. 为什么需要不同的存储 ...
- sql性能分析以及sql语句的优化
sql性能分析的几种方式 SQL执行频率 show [session|global] status like 'com__(七个下划线)_';可以查看当前数据库的INSERT.UPDATE.DELET ...
- Mysql查看状态,连接数,线程数以及Mysql性能监控工具doDBA的使用以及优化
解决问题: 怎样查看Mysql最大连接数(max_connections)?怎样修改max_connections? 怎样查看Mysql线程缓存池数量(thread_cache_size)?threa ...
- Mysql常用30种SQL查询语句优化方法
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...
- MySQL 常用30种SQL查询语句优化方法
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及 ...
最新文章
- Google发布机器学习术语表 (中英对照)
- SAP PM 初级系列8 - PM 组织架构
- 一文掌握RNA seq,RNA seq课程大汇总
- Spark on Yarn:任务提交参数配置
- C语言 文件操作9--fgetc()和fputc()
- Spark Structure Streaming(一)之简介
- oracle11g dataguard物理备库搭建
- 更新MySQL复制 自动监控脚本
- Linux命令速查手册出炉!
- 模拟get和post请求(支持自定义header和测试CDN节点)
- mysql cluster安装报错
- Java打印菱形(一)
- linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]
- IPv4和IPv6、局域网和广域网、网关、公网IP和私有IP、IP地址、子网掩码、网段、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?
- Windows环境下Python中multiprocessing关于RuntimeError异常的处理方式
- 苹果6s微信提示未连接服务器,苹果6s微信无法打开,一直显示正在载入怎么处理?...
- winform去掉laber背景色
- iPhone 5s 如何进入 DFU 模式,macOS 无法进入 DFU 模式
- 【问题描述】编写一个程序计算出球、圆柱和圆锥的表面积和体积。
- 不平衡学习(Imbalanced learning)