精心总结十三条建议,帮你创建更合适的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 是创建软件原型的快速有力的工具.上手很容易,但是,其中存在一个危险.这款软件是如此的直观以至于很多用户可以在没有接受过任何正式培训的情况下进行使用.他们可能不知道的是他们可能没有以恰当的方 ...
随机推荐
- 关于position的relative和absolute分别是相对于谁进行定位的
position:absolute; 他的意思是绝对定位,他是参照浏览器的左上角,配合TOP.RIGHT.BOTTOM.LEFT(下面简称TRBL)进行定位,在没有设定TRBL,默认依据父级的做标原始 ...
- 干掉Switch-Case、If-Else----订阅发布模式+事件驱动模式
在上位机和下位机或者服务端和客户端通信的时候,很多时候可能为了赶项目进度或者写代码方便直接使用Socket通信,传输string类型的关键字驱动对应的事件,这就有可能导致程序中存在大量的Switch- ...
- 封装axios请求
import axios from 'axios' import router from '@/router' axios.defaults.baseURL = system.requestBaseU ...
- 理“ Druid 元数据”之乱
vivo 互联网大数据团队-Zheng Xiaofeng 一.背景 Druid 是一个专为大型数据集上的高性能切片和 OLAP 分析而设计的数据存储系统. 由于Druid 能够同时提供离线和实时数据的 ...
- Flask 之 高可用IP代理网站
高可用代理IP网站 目标:提供高可用代理IP 步骤一:通过爬虫获取代理IP 步骤二:对代理IP进行检测,判断代理是否可用 步骤三:将可用的代理IP写入mongodb数据库 步骤四:创建网站,从数据库获 ...
- Python with语句和上下文管理器
open("FishC.txt","w")#此处需注意如果被打开的文件中,已有内容,那么用w的方式打开,则会导致原文件内容被截断,也就是相当于被清空了,然后重新 ...
- 【clickhouse专栏】对标mongodb存储类JSON数据文档统计分析
一.文档存储的需求 很多的开发者都使用过mongodb,在mongodb中数据记录是以文档的形式存在的(类似于一种多级嵌套SQL的形式).比如下面的JSON数据结构:dev_ip表示某一台服务器的ip ...
- 第1期 考研中有关函数的一些基本性质《zobol考研微积分学习笔记》
在入门考研微积分中,我们先复习一部分中学学的初等数学的内容.函数是非常有用的数学工具. 1.函数的性质理解: 首先考研数学中的所有函数都是初等函数.而函数的三个关键就是定义域.值域.对应关系f. 其中 ...
- 论文解读(DCN)《Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering》
论文信息 论文标题:Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering论文作者:Bo Yang, Xi ...
- java基础知识面试总结-部分
前言 在平时的工作学习中,自己对微服务和springboot基础理论知识关注比较少,在面试中对于面试官的问题,很多基本都不能够达到精准,全面:现将自己面试中的问题做以总结: 1.谈谈你对微服务架构的认 ...