MySQL索引实践
数据库索引本质上是一种数据结构(存储结构+算法),目的是为了加快数据检索速度。
1、索引的类型(待完善)
主键索引:给表设置主键,这个表就拥有主键索引。
唯一索引:unique
普通索引:增加某个字段的索引,比如用户表根据用户名查询。
组合索引:使用多个字段创建索引,遵循最左原则,比如创建索引(col1 + col2 + col3),相当于创建了(col1)、(col1,col2)、(col,col2,col3)三个索引。
全文索引:
2、聚簇索引与非聚簇索引(待完善)
MySQL的InnoDB主键使用的是聚簇索引,MyISAM 不管是主键索引,还是二级索引使用的都是非聚簇索引。

非聚簇索引(右图),表数据和索引是分成两部分进行存储,主键索引和二级索引存储上没有任何区别。使用B+树作为索引的存储结构,所有的节点都是索引,叶子节点存储的是索引+索引对应的记录的地址。
聚簇索引(左图),表数据和主键一起存储的,主键索引的叶结点存储行数据(包含主键值),二级索引的叶结点存储行的主键值。使用B+树作为索引的存储结构,非叶子节点都是索引关键字,但非叶子节点中的关键字中不存储对应记录的具体内容或内容地址。叶子节点上的数据是主键与具体记录(数据内容)。
聚簇索引优点:
①当需要取出一定范围内的数据时,用聚簇索引比用非聚簇索引好。
②当通过聚簇索引查找目标数据时理论上比非聚簇索引要快,因为非聚簇索引定位到对应主键时还要多一次目标记录寻址,即多一次I/O
聚簇索引缺点:
①插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
②更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
③二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
二级索引的叶节点存储的是主键值,而不是行指针(非聚簇索引存储的是指针或者说是地址),这是为了减少当出现行移动或数据页分裂时二级索引的维护工作,但会让二级索引占用更多的空间。
④采用聚簇索引插入新值比采用非聚簇索引插入新值的速度要慢很多,因为插入要保证主键不能重复,判断主键不能重复,采用的方式在不同的索引下面会有很大的性能差距,聚簇索引遍历所有的叶子节点,非聚簇索引也判断所有的叶子节点,但是聚簇索引的叶子节点除了带有主键还有记录值,记录的大小往往比主键要大的多。这样就会导致聚簇索引在判定新记录携带的主键是否重复时进行昂贵的I/O代价。
3、索引实践(待完善)
#创建班级表
CREATE TABLE class
(
pid INTEGER not null AUTO_INCREMENT,
class_code VARCHAR(200) not null,
class_name VARCHAR(200) not null,
created_by VARCHAR(200),
created_date DATE,
updated_by VARCHAR(200),
updated_date DATE,
CONSTRAINT pk_class_pid PRIMARY KEY(pid)
);
#插入数据
insert into stu.class (class_code,class_name,created_by,created_date,updated_by,updated_date)
values
( '1-001', '一年级1班','system', NOW(),'system',NOW()),
( '1-002', '一年级2班','system', NOW(),'system',NOW()),
( '2-001', '二年级1班','system', NOW(),'system',NOW()),
( '2-002', '二年级2班','system', NOW(),'system',NOW());
#使用主键索引
EXPLAIN
select * from class where pid = 2;

#创建普通索引
CREATE INDEX idx_class_class_code ON class(class_code);
#使用索引
EXPLAIN
select * from class where class_code = '2-001';

#创建组合索引
CREATE INDEX idx_class_class_code_name ON class(class_code,class_name);
#使用索引
EXPLAIN
select * from class where class_code = '2-001' and class_name = '一年级2班';
#使用索引,组合索引所有字段与顺序无关
EXPLAIN
select * from class where class_name = '一年级2班' and class_code = '2-001';

#组合索引只使用第一个字段时,索引可生效
#删除索引
DROP INDEX idx_class_class_code ON class;
EXPLAIN
select * from class where class_code = '2-001';

#未使用索引,遵循最左原则
EXPLAIN
select * from class where class_name = '一年级2班';

#创建唯一索引
CREATE UNIQUE INDEX idx_uq_class_class_code ON class(class_code);
#删除已有的组合索引
DROP INDEX idx_class_class_code_name ON class;
#使用唯一索引
EXPLAIN
select * from class where class_code = '2-001';

MySQL索引实践的更多相关文章
- MySQL 索引最佳实践
原文请关注 这里 这是 文章 的翻译,在翻译过程中,会对其中涉及到的语句加上一些个人理解以及 SQL 语句的执行,并进行特别的标注. 1. 你做了一个很棒的选择,因为: 对于普通开发者和 DBA,理解 ...
- mysql索引最佳实践
索引最佳实践使用的表CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT ...
- Mysql索引最佳实践笔记0524
#mysql5.7 innodb默认存储引擎 一.关于索引二.最佳实践三.避坑实践 一.关于索引 1.索引的作用 -提高查询效率 -数据分组.排序 -避免回表查询 -优化聚集查询 -用于多表join关 ...
- [译] MYSQL索引最佳实践
近日整理文档时发现多年前的这个文档还是蛮实用的,然后在网络搜索了一下并没有相关的译文,所以决定把它翻译过来,如有不当的地方请多包涵和指正.原文地址:https://www.percona.com/fi ...
- 【转】MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- [转]MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- [纯干货] MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- MySQL 索引背后的数据结构及算法原理
本文转载自http://blog.jobbole.com/24006/ 摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引 ...
随机推荐
- appium——如何导出夜神模拟器下载“微信”app的apk
背景:夜神模拟器是一款功能强大的安卓模拟器,但是当我们在上面下载APP应用后,通常不知道apk文件在哪里,下面以“微信”APP为例做一下详细介绍. 一般情况下,使用夜神安卓模拟器下载的文件只能在夜神安 ...
- Spark_Transformation和Action算子
Transformation 和 Action 常用算子 一.Transformation 1.1 map 1.2 filter 1.3 flatMap ...
- npm WARN enoent ENOENT: no such file or directory
https://github.com/visionmedia/debug/issues/261
- 腾讯几款QQ软件
1.QQ(普通版QQ) https://im.qq.com/ 2.Tim(QQ办公简洁版) https://tim.qq.com/ https://baike.baidu.com/item/Tim/2 ...
- Bootstrap组件的使用
五.常用组件 总结: boot中事件,关注两件事 1.事件是如何触发的.自定义属性触发,触发方式是这个属性的值 2.事件触发的目标 button绑定目标 data-target="#id&q ...
- NodeJS的概述
1.NodeJS概述 基于谷歌V8引擎,运行在服务器端的环境 对比JS和NodeJS (1)JS运行在浏览器端,存在多种浏览器解释器,容易产生兼容性的问题:而NodeJS运行在服务器端,只有V8引擎一 ...
- 19-6 通过t-sql实现约束
------------------------------------------------------------------------ --通过t-sql语句来创建约束 ---------- ...
- 一篇文教你使用python Turtle库画出“精美碎花小清新风格树”快来拿代码!
Turtle库手册可以查询查询 python图形绘制库turtle中文开发文档及示例大全,手册中现有示例,不需要自己动手就可以查看演示. 使用Turtle画树,看了一下网上的代码,基本上核心的方法是使 ...
- JS中Class的两种写法
写法一:使用函数: var ClassName = function() { this.message = 'dat.gui'; this.speed = 0.8; this.displayOutli ...
- [JavaWeb基础] 016.Struts2 国际化配置
如果一个软件想要让其受众是全球或者是几个国家的人,那么这个软件就需要支持多种语言,那么我们就需要软件的国际化去对一些文字信息进行国际化处理.web也一样,当外国人打开我们的网站,要是看到满屏幕的中文, ...