精心总结十三条建议,帮你创建更合适的MySQL索引

上篇文章讲到使用MySQL的Explain命令可以分析SQL性能瓶颈,优化SQL查询,以及查看是否用到了索引。

我们都知道创建索引可以提高查询效率,但是究竟如何创建索引呢?

[En]

We all know that creating an index can improve query efficiency, but how exactly do you create an index?

哪些字段适合创建索引?

哪些字段不适合创建索引?

[En]

Which fields are not suitable for index creation?

本文将帮助您了解如何创建适当的数据库索引。

[En]

This article is with you to learn how to create an appropriate database index.

1. MySQL索引的分类

在创建索引之前了解一下MySQL有哪些索引,然后我们才能选择合适的索引。

常用索引有通用索引、唯一索引、主键索引、联合索引、全文索引等。

[En]

Common indexes are general index, unique index, primary key index, joint index, full-text index and so on.

普通索引

一般指数是最基本的指数,没有任何限制。

[En]

A general index is the most basic index, without any restrictions.

您可以使用以下命令创建普通索引:

[En]

You can use the command to create a normal index:

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);

联合索引

联合索引同时在多个字段上创建索引,从而提高了查询效率。

[En]

A federated index creates an index on multiple fields at the same time, which makes the query more efficient.

创建方式是这样的:

ALTER TABLE table_name ADD INDEX index_name (column1, column2, column3);

全文索引

全文索引主要用于匹配字符串文本中的关键字。

[En]

Full-text indexing is mainly used to match keywords in string text.

当需要字符串中是否包含关键字的时候,我们一般用like,如果是以%开头的时候,则无法用到索引,这时候就可以使用全文索引了。

创建方式是这样的:

ALTER TABLE table_name ADD FULLTEXT (column);

2. 哪些字段适合创建索引?

我总结了有以下几条:

2.1 频繁查询的字段适合创建索引

表中总是有热的和冷的字段,很明显,频繁使用的字段更适合对其进行索引。

[En]

There are always hot and cold fields in a table, and it’s clear that frequently used fields are more suitable for indexing it.

2.2 在where和on条件出现的字段优先创建索引

为什么不是在select后面出现的字段优先创建索引?

因为查询SQL会先匹配on和where条件的字段,具体的匹配顺序是这样的:

from > on > join > where > group by > having > select > distinct > order by > limit

2.3 区分度高的字段适合创建索引

例如,对于用户表,生日比性别更有区别,更适合编制索引。

[En]

For example, for a user table, birthdays are more differentiated than gender and are more suitable for indexing.

您可以使用以下方法手动统计每个字段的差异。该值越大,差异化程度越高:

[En]

You can use the following method to manually count the differentiation of each field. The higher the value, the higher the differentiation:

select
    count(distinct birthday)/count(*),
    count(distinct gender)/count(*)
from user;

精心总结十三条建议,帮你创建更合适的MySQL索引

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

精心总结十三条建议,帮你创建更合适的MySQL索引

图中 Cardinality列表示索引的区分度排名,也被称为基数。

2.4 有序的字段适合创建索引

有序的字段在插入数据库的过程中,仍能保持B+树的索引结构,不需要频繁更新索引文件,性能更好。

3. 哪些字段不合适创建索引?

在说明了哪些字段适合创建索引之后,还有一些字段不适合创建索引。

[En]

After saying which fields are suitable for creating an index, there are fields that are not suitable for creating an index.

3.1 区分度低的字段不适合创建索引。

我只是说,用户表中的性别区别较小,因此不像生日字段那样适合创建索引。

[En]

I just said that the gender in the user table is less differentiated, so it is not as suitable for creating an index as the birthday field.

3.2 频繁更新的字段不适合创建索引

更新字段的过程中,需要维护B+树结构,会频繁更新索引文件,降低SQL性能。

3.3 过长的字段不适合创建索引

过长的字段会占用更多空间,不适合创建索引。

[En]

Fields that are too long take up more space and are not suitable for index creation.

3.4 无序的字段不适合创建索引

无序的字段在插入数据库的过程中,为了维护B+树索引结构,需要频繁更新索引文件,性能较差。

4. 创建索引的其他注意事项

4.1 优先使用联合索引

在查询时,联邦索引可以比普通索引更准确地匹配所需的数据。

[En]

When querying, the federated index can match the required data more accurately than the ordinary index.

精心总结十三条建议,帮你创建更合适的MySQL索引

图中就是在(age,name)两个字段上建立的联合索引,在B+树中的存储结构。

可以看出,是先age排序,age相等的数据,再按name排序。

对于这条查询SQL:

select age,name from user where age=18 and name='李四';

联合索引只需一次就可以查到所需数据,如果我们只在age字段上建立索引,会先匹配到age=18的三条数据,然后再逐个遍历,效率更差,所以平时应该优先使用联合索引。

4.2 使用联合索引时,区分度的字段放前面

这将减少查询次数,并更快地匹配所需数据。

[En]

This reduces the number of queries and matches the required data more quickly.

4.3 过长字符串可以使用前缀索引

例如,在匹配用户地址时,如果乡镇已经能区分大部分用户,就不一定要准确到邻里。

[En]

For example, when matching user addresses, if the township can already distinguish most of the users, it is not necessary to be accurate to the neighborhood.

创建普通索引时,指定索引长度,即可创建前缀索引。

[En]

When creating a normal index, specify the index length, and you can create a prefix index.

ALTER TABLE user ADD INDEX idx_address (address(3));

4.4 值唯一的字段,使用唯一索引

使用唯一索引,可以避免程序bug导致产生重复数据。

4.5 排序和分组字段也尽量创建索引

在order by和group by中的字段也尽量创建索引,避免使用文件排序,可以使用索引排序提供性能。

4.6 避免创建过多索引

索引好用,适度即可。创建过多的索引,会占用更多存储空间,也会严重影响SQL性能,每次更新SQL,都需要更新大量索引文件,得不偿失。

知识点总结:

精心总结十三条建议,帮你创建更合适的MySQL索引

文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。

Original: https://www.cnblogs.com/yidengjiagou/p/16538652.html
Author: 一灯架构
Title: 精心总结十三条建议,帮你创建更合适的MySQL索引

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505115/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Liunx(CentOS)安装Nacos(单机启动,绑定Mysql)

    Liunx安装Nacos(单机启动,绑定Mysql) 一,准备安装包 github下载点 二,在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/…

    数据库 2023年6月11日
    072
  • tiler–python实现的有趣的自定义马赛克图像拼接工具

    最近在github中发现了一个有趣的小工具,tiler github链接https://github.com/nuno-faria/tiler 具体介绍请直接去github,这里只…

    数据库 2023年6月11日
    089
  • 从零开始搭建高可用的k8s集群

    一、环境准备 使用Hyper-V虚拟机功能搭建三台Centos虚拟机系统,配置好静态IP,分别为k8s-node1(192.168.0.8),k8s-node2(192.168.0…

    数据库 2023年6月14日
    091
  • 工具 | 常用 MySQL 内核 Debug 技巧

    作者:柯煜昌 顾问软件工程师目前从事 RadonDB MySQL 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 掌握 MySQL 内核源码的阅读和调试能力,不仅…

    数据库 2023年5月24日
    0113
  • Linux–>组管理和权限管理

    在Linux中的每一个用户必须属于一个组,不能独立于组外。 在Linux中每个文件有, 所有者, 所在组, 其他组的概念 查看文件的所有者 ls -ahl 举例: 改变文件所有者 …

    数据库 2023年6月14日
    0138
  • Node.js安装

    nvm NVM: Node Version Manager 下载地址 Mac/Linux安装 nvm:https://github.com/nvm-sh/nvm Windows 安…

    数据库 2023年6月6日
    090
  • mysql 事务 隔离性 锁

    1、四大特性 1.1 原子性(Atomicity) 事务是一个不可分割的最小工作单元。事务是一个不可分割的最小工作单元。 [En] A transaction is an indi…

    数据库 2023年5月24日
    077
  • Java中AES加密和解密的方法分享

    转自: http://www.java265.com/JavaJingYan/202206/16559759223818.html 下文笔者讲述java代码实现的AES加密和解密的…

    数据库 2023年6月11日
    094
  • Spark学习(3) SparkSQL

    什么事sparkSQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用, 它是将Spark…

    数据库 2023年6月16日
    089
  • 在Ubuntu系统上安装StoneDB数据库

    今天我会进行StoneDB数据库在Ubuntu 22.04系统下的安装。 严格按照官方文档的步骤操作,看看安装能否成功。 [En] Strictly follow the step…

    数据库 2023年5月24日
    0102
  • 二叉树遍历的常用方法

    概述 二叉树的遍历可以说是解决二叉树问题的基础。我们常用的遍历方式无外乎就四种 前序遍历、 …

    数据库 2023年6月11日
    084
  • SQL基础一

    一、SQL基本术语 数据库管理系统(DBMS,database management system)。人们通常用数据库这个术语来代表他们使用的数据库软件,这是不正确的。确切地说,数…

    数据库 2023年6月16日
    076
  • day03-MySQL基础知识02

    MySQL基础知识02 4.CRUD 数据库CRUD语句:增(create)、删(delete)、改(update)、查(Retrieve) Insert 语句 (添加数据) Up…

    数据库 2023年6月11日
    078
  • 2022-8-10 JAVA的反射机制

    反射机制 AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方…

    数据库 2023年6月14日
    077
  • 常见的位操作及其应用

    概述 与、或、异或、取反或者移位运算这几种基本的位操作想必诸位读者并不陌生,如果我们能在某些合适场景下使用位运算,有些时候可以大大提高算法的效率。但由于本身位运算太过灵活,甚至某些…

    数据库 2023年6月11日
    078
  • 互联网校招指北

    这篇文章写着写着,突然觉得《紧急救援》中有一句台词很对: “不是幸运给你机会,而是因为够坚持,才有了幸运的机会” 共勉~ 时间跨度 一年共两次校招季,2 月…

    数据库 2023年6月6日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球