精心总结十三条建议,帮你创建更合适的MySQL索引
上篇文章讲到使用MySQL的Explain命令可以分析SQL性能瓶颈,优化SQL查询,以及查看是否用到了索引。
我们都知道创建索引可以提高查询效率,但是具体该怎么创建索引?
哪些字段适合创建索引?
哪些字段又不适合创建索引?
本文跟大家一块学习一下如何创建合适数据库索引。
1. MySQL索引的分类
在创建索引之前了解一下MySQL有哪些索引,然后我们才能选择合适的索引。
常见的索引有,普通索引、唯一索引、主键索引、联合索引、全文索引等。
普通索引
普通索引就是最基本的索引,没有任何限制。
可以使用命令创建普通索引:
ALTER TABLE `table_name` ADD INDEX index_name (`column`);
唯一索引
与普通索引不同,唯一索引的列值必须唯一,允许为null。
创建方式是这样的:
ALTER TABLE `table_name` ADD UNIQUE index_name (`column`);
主键索引
主键索引是一种特殊的唯一索引,并且一张表只有一个主键,不允许为null。
创建方式是这样的:
ALTER TABLE `table_name` ADD PRIMARY KEY (`column`);
联合索引
联合索引是同时在多个字段上创建索引,查询效率更高。
创建方式是这样的:
ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`);
全文索引
全文索引主要用来匹配字符串文本中关键字。
当需要字符串中是否包含关键字的时候,我们一般用like,如果是以%开头的时候,则无法用到索引,这时候就可以使用全文索引了。
创建方式是这样的:
ALTER TABLE `table_name` ADD FULLTEXT (`column`);
2. 哪些字段适合创建索引?
我总结了有以下几条:
2.1 频繁查询的字段适合创建索引
一张表的字段总会有冷热之分,很明显那些频繁使用的字段更适合为它创建索引。
2.2 在where和on条件出现的字段优先创建索引
为什么不是在select后面出现的字段优先创建索引?
因为查询SQL会先匹配on和where条件的字段,具体的匹配顺序是这样的:
from > on > join > where > group by > having > select > distinct > order by > limit
2.3 区分度高的字段适合创建索引
比如对于一张用户表来说,生日比性别的区分度更高,更适合创建索引。
可以使用下面的方式手动统计一下,每个字段的区分度,值越大,区分度越高:
select
count(distinct birthday)/count(*),
count(distinct gender)/count(*)
from user;

对于已经创建好的索引,我们还可以使用MySQL命令查看每个索引的区分度排名:

图中Cardinality列表示索引的区分度排名,也被称为基数。
2.4 有序的字段适合创建索引
有序的字段在插入数据库的过程中,仍能保持B+树的索引结构,不需要频繁更新索引文件,性能更好。
3. 哪些字段不合适创建索引?
说完哪些字段适合创建索引,就有不适合创建索引的的字段。
3.1 区分度低的字段不适合创建索引。
刚才说了用户表中性别的区分度较低,不如生日字段适合创建索引。
3.2 频繁更新的字段不适合创建索引
更新字段的过程中,需要维护B+树结构,会频繁更新索引文件,降低SQL性能。
3.3 过长的字段不适合创建索引
过长的字段会占用更多的空间,不适合创建索引。
3.4 无序的字段不适合创建索引
无序的字段在插入数据库的过程中,为了维护B+树索引结构,需要频繁更新索引文件,性能较差。
4. 创建索引的其他注意事项
4.1 优先使用联合索引
查询的时候,联合索引比普通索引能更精准的匹配到所需数据。

图中就是在(age,name)两个字段上建立的联合索引,在B+树中的存储结构。
可以看出,是先age排序,age相等的数据,再按name排序。
对于这条查询SQL:
select age,name from user where age=18 and name='李四';
联合索引只需一次就可以查到所需数据,如果我们只在age字段上建立索引,会先匹配到age=18的三条数据,然后再逐个遍历,效率更差,所以平时应该优先使用联合索引。
4.2 使用联合索引时,区分度的字段放前面
这样可以减少查询次数,更快地匹配到所需数据。
4.3 过长字符串可以使用前缀索引
比如在匹配用户地址的时候,如果乡镇已经能区分大部分用户了,就没必要精确到街道小区了。
创建普通索引的时候,指定索引长度,就可以创建前缀索引了。
ALTER TABLE `user` ADD INDEX idx_address (address(3));
4.4 值唯一的字段,使用唯一索引
使用唯一索引,可以避免程序bug导致产生重复数据。
4.5 排序和分组字段也尽量创建索引
在order by和group by中的字段也尽量创建索引,避免使用文件排序,可以使用索引排序提供性能。
4.6 避免创建过多索引
索引好用,适度即可。创建过多的索引,会占用更多存储空间,也会严重影响SQL性能,每次更新SQL,都需要更新大量索引文件,得不偿失。
知识点总结:

文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。
精心总结十三条建议,帮你创建更合适的MySQL索引的更多相关文章
- 10条建议帮助你创建更好的jQuery插件
本文总结了帮助你创建更好jQuery插件的10条建议.分享给大家供大家参考.具体说明如下: 在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就 ...
- 转:10条建议让你创建更好的jQuery插件
在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了.使 ...
- 10 条建议让你创建更好的 jQuery 插件
在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了. ...
- 10条建议让你创建更好的jQuery插件
在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了.使 ...
- 10条建议让你创建更好的jQuery插件(转载)
为了避免重复造轮子,自己手动开发jquery 插件,让小组其他成员可以直接使用.学习开发中,看到Phillip Senn 写的 关于jquery 插件开发注意10点,转载之! ------------ ...
- 精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队
上篇文章介绍了如何创建合适的MySQL索引,今天再一块学一下如何更规范.更合理的使用MySQL? 合理规范的使用MySQL,可以大大减少开发工作量和线上问题,并提升SQL查询性能. 我精心总结了这16 ...
- MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】
MySQL如何创建一个好索引?创建索引的5条建议 过滤效率高的放前面 对于一个多列索引,它的存储顺序是先按第一列进行比较,然后是第二列,第三列...这样.查询时,如果第一列能够排除的越多,那么后面列需 ...
- 提高Axure设计效率的10条建议
http://www.woshipm.com/ucd/92153.html Axure 是创建软件原型的快速有力的工具.上手很容易,但是,其中存在一个危险.这款软件是如此的直观以至于很多用户可以在没有 ...
- 提高Axure设计效率的10条建议 (转)
Axure 是创建软件原型的快速有力的工具.上手很容易,但是,其中存在一个危险.这款软件是如此的直观以至于很多用户可以在没有接受过任何正式培训的情况下进行使用.他们可能不知道的是他们可能没有以恰当的方 ...
随机推荐
- 【Java8新特性】Stream(分类+案例)
一.Stream概述 什么是Stream? Stream是Java8引入的全新概念,它用来处理集合中的数据,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数 ...
- MUI+html5+script 不同页面间转跳(九宫格)
在点击图片/标题需要跳转到详情页面的使用场景中,首先定义图片元素的id为"tyzc",是同一类下的第一个图片 <img src="img/img3.png" ...
- 构建第一个模型:KNN算法(Iris_dataset)
利用鸢尾花数据集完成一个简单的机器学习应用~万丈高楼平地起,虽然很基础,但是还是跟着书敲了一遍代码. 一.模型构建流程 1.获取数据 本次实验的Iris数据集来自skicit-learn的datase ...
- vue运行npm run dev时候,自动打开页面
在config/index.js找到dev:{}里面的autoOpenBrowser: 设置为true,重新npm run dev一次就自动弹出浏览器页面啦!
- 从单例谈double-check必要性,多种单例各取所需
theme: fancy 前言 前面铺掉了那么多都是在讲原则,讲图例.很多同学可能都觉得和设计模式不是很搭边.虽说设计模式也是理论的东西,但是设计原则可能对我们理解而言更加的抽象.不过好在原则东西不是 ...
- GDKOI 2021 Day3 PJ 懵逼记
今天早了一点起来,初三的大奆都来做比赛了, 自然,自测的有许多 AK 虽然今天的题比昨天简单,但还是脑子还是十分迟钝,以至于贪心都想不出 真为明天的提高组而担忧 T1 斜率被卡 90 ,直接用勾股定理 ...
- C语言- 基础数据结构和算法 - 动态数组
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- 《Java基础——IO流》
Java基础--IO流 一.字节流: 1.输入流 (InputStream) 规则: 此处用于读取txt文件中的内容. 代码: import java.io.*; public c ...
- 用Python实时获取Steam特惠游戏数据,我看看谁的钱包还有钱
前言 大家好鸭, 我是小熊猫 Steam大家应该不陌生吧?不知道的话就让我们来了解一下吧~(一下简称"S") S是由美国电子游戏商Valve于2003年9月12日推出的数字发行平台 ...
- LeetCode. 812. 最大三角形面积
812. 最大三角形面积 鞋带公式 鞋带公式,用于计算任意多边形的面积,可用于计算三角形的面积 已知 ΔABC 三个顶点的坐标 A:(x1,y1). B:(x2,y2). C:(x3,y3) 对应的矩 ...