mysql联合索引

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
  1. 在一次查询中,MySQL只能使用一个索引。

  2. 在真实项目中,SQL语句中的WHERE子句里通常会包含多个查询条件还会有排序、分组等。

  3. 若表中索引过多,会影响INSERT及UPDATE性能,简单说就是会影响数据写入性能。因为更新数据的同时,也要同时更新索引。

  4. 最实际的好处当然是查询速度快,性能好。

举例:
创建一张数据表

CREATE TABLE `student` (  `studentId` int(11) NOT NULL,  `studentName` varchar(255) DEFAULT NULL,  `gradeId` int(11) DEFAULT NULL,  `schoolId` int(11) DEFAULT NULL,  PRIMARY KEY (`studentId`),  KEY `s_g_s` (`schoolId`,`gradeId`,`studentId`)
)

假设每个班有50名学生,一个年级有10个班,一所学校有4个年级,共有3所学校,那么总共会有6000名学生

若要查询出第2所学校3年级学生的姓名,SQL如下
SELECT studentName FROM student WHERE schoolId=2 AND gradeId=3
如果使用名为s_g_s的联合索引,那通过索引,MySQL可筛选掉大部分不满足查询条件的学生信息,在这个例子中,可筛掉5500条记录,这样MySQL只需回表查询剩余的500条记录即可得到结果。
如果只使用schoolId上的单列索引,只能筛掉4000条记录,需回表扫描过滤剩余的2000条记录才能得到结果,从数量上看差了一个数量级。性能自然不佳。

若要查询出第2所学校3年级学生的姓名并按照studentId倒排,SQL如下
SELECT studentName FROM student WHERE schoolId=2 AND gradeId=3 ORDER BY studentId DESC
这条SQL若没有多列索引,在较大数据量下性能会很差。但有了s_g_s索引,排序可以在索引上直接完成,不用MySQL取回记录后,再在内存或者磁盘上进行一次排序。性能提升很大。

若要查询出第2所学校3年级学生的studentId,SQL如下
SELECT studentId FROM student WHERE schoolId=2 AND gradeId=3
对于这条查询,s_g_s索引包含所有需要查询的字段的值,MySQL根本不需要再去读取表中的记录,直接全部在索引上完成,这是性能最高的一种索引,通常称为“覆盖索引”。

这个例子有点“简陋”,但还是可以说明一些问题。
综上,在实际项目中,
- 联合索引的使用要远多于单列索引。
- 联合索引使用正确对性能提升很有帮助。
- 怎么加索引,把哪些列加索引,加几个索引都是需要根据项目中使用到的SQL及数据表中数据的分布、数据的区分度去衡量的。
- 使用MySQL explain工具来解析SQL查询执行计划。

本文转自  陈小龙哈   51CTO博客,原文链接:http://blog.51cto.com/chenxiaolong/1787831
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 MySQL
MySQL 八股文中的联合索引最左匹配原则结论正确? 值得去亲手验证一下,纠正全网错误结论
MySQL 八股文中的联合索引最左匹配原则结论正确? 值得去亲手验证一下,纠正全网错误结论
32 0
|
8月前
|
关系型数据库 MySQL 索引
MySQL -- 联合索引 使用原则
MySQL -- 联合索引 使用原则
97 0
|
8月前
|
关系型数据库 MySQL 索引
MySQL----前缀索引 & 单列索引与联合索引
MySQL----前缀索引 & 单列索引与联合索引
|
11月前
|
存储 缓存 关系型数据库
MySQL-索引优化篇(1)_安装演示库 & [前缀索引、联合索引、覆盖索引] & explain参数
MySQL-索引优化篇(1)_安装演示库 & [前缀索引、联合索引、覆盖索引] & explain参数
56 0
|
存储 关系型数据库 MySQL
MySQL中什么是什么是主键索引、联合索引、覆盖索引、索引条件下推及区别
主键索引:它是一种特殊的唯一索引,不允许有空值,一般在建表的时候指定主键,就会创建主键索引,CREATE INDEX不能用来创建主键索引,通常使用ALTER TABLE来代替。
132 0
|
存储 关系型数据库 MySQL
【MySQL从入门到精通】【高级篇】(八)聚簇索引&非聚簇索引&联合索引
上一篇文章我们介绍了【MySQL从入门到精通】【高级篇】(七)设计一个索引&InnoDB中的索引方案,该文介绍了如何设计一个索引,以及InnoDB中的索引如何形成。
117 0
【MySQL从入门到精通】【高级篇】(八)聚簇索引&非聚簇索引&联合索引
|
关系型数据库 MySQL 索引
mysql普通索引和联合索引测试
mysql普通索引和联合索引测试
122 0
|
存储 容灾 关系型数据库
Mysql回表与索引覆盖,联合索引问题
Mysql回表与索引覆盖,联合索引问题
92 0
Mysql回表与索引覆盖,联合索引问题
|
存储 关系型数据库 MySQL
|
存储 关系型数据库 MySQL
【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引
【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引
【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引