0
点赞
收藏
分享

微信扫一扫

Mysql索引知识点汇总

什么是索引?

索引是数据库中一种重要的数据结构,它用于提高数据检索的速度。

可以将索引视为书籍的目录,通过目录可以快速找到某一章节而无需逐页翻阅。

索引在数据库管理系统(DBMS)中起到加速查询、优化性能的重要作用。

使用索引的优缺点

优点:

  • 提高查询速度
  • 加速排序和分组

缺点

  • 占用额外空间
  • 降低数据更新速度


索引结构

Mysql索引知识点汇总_联合索引

Mysql索引知识点汇总_使用索引注意点_02

我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。

二叉树

Mysql索引知识点汇总_索引失效_03

b树

Mysql索引知识点汇总_联合索引_04

b+树

在b+树中所有的数据都存在叶子节点中,并且叶子结点会形成一个单向链表。其余的部分可以理解为索引,加快数据的查找。

Mysql索引知识点汇总_联合索引_05

Mysql中对于b+树的优化

Mysql索引知识点汇总_联合索引_06

hash索引

Mysql索引知识点汇总_索引失效_07

Mysql索引知识点汇总_索引失效_08

思考?

Mysql索引知识点汇总_联合索引_09

索引分类

Mysql索引知识点汇总_索引失效_10

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种

Mysql索引知识点汇总_联合索引_11

Mysql索引知识点汇总_索引失效_12

在Mysql中进行查询,如果走的不是聚集索引,那么会先去二级索引查询符合要求的数据,因为二级索引中存的是数据的ID。所以在获取后,会再去走聚集索引进行查询具体的行数据。这一个操作也叫做回表查询。


索引语法

创建索引

在创建索引的时候,如果不指定索引的类型,会使用默认的索引类型。

如果添加了多列,一般会称为联合索引。联合索引中列的先后顺序也是会有影响的。会在后面详细介绍。

CREATE 索引类型 INDEX 索引名称 ON 表名(列名)
CREATE INDEX idx_name ON orders(order_id)
CREATE INDEX idx_id_phone ON orders(order_id,phone)

查看索引

show INDEX from tableName

Mysql索引知识点汇总_使用索引注意点_13

可以看到这里有一个主键索引和刚才创建的order_id索引,以及联合索引。

删除索引

DROP index 索引名称 on 表名
DROP index idx_id_phone on orders

SQL性能分析

sql执行频率

MySQL客户端连接成功后,通过show[session | global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:

show GLOBAL STATUS LIKE 'com_________'

根据返回的数据,来判断当前数据库是增删改查中哪一项高,如果是查询高的话,就可以进行下一步日志分析,进行优化。

慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。

MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息。

Mysql索引知识点汇总_索引失效_14

在配置文件中更改了设置之后,需要重启服务才能生效。之后可以通过慢查询的日志来定位耗时比较长的sql语句,然后执行优化。

Mysql索引知识点汇总_索引失效_15

profile详情

show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持.

select  @@have_profiling

Mysql索引知识点汇总_索引失效_16

如果为yes则支持,否则不支持。

默认profiling是关闭的,可以通过set语句在session/global级别开启profiling:

SELECT @@profiling #查看是否开启,1开启,0关闭
SET profiling =1 #设置状态为1,卡其

查看耗时分析

show PROFILES

Mysql索引知识点汇总_联合索引_17

查看指定query id的SOL语句各个阶段的耗时情况

show profile for query query_id;

查看指定query id的SOL语句CPU的使用情况

show profile cpu for query query id;

explain执行计划

EXPLAIN 或者 DESC命令获取 MySQL如何执行 SELECT语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。

EXPLAIN SELECT * from kao_yan_zi_liao

Mysql索引知识点汇总_联合索引_18

Mysql索引知识点汇总_联合索引_19

Mysql索引知识点汇总_联合索引_20

注意:参数中尤其要求注意type字段,该字段为null最好,all最差。在sql优化中是重点参数指标。索引使用

Mysql索引知识点汇总_联合索引_21

在千万级数量的时候,如果不创建索引。执行的时间在20S左右。当创建完之后,时间缩短到了0.01秒。

Mysql索引知识点汇总_索引失效_22

最左前缀法则

如果说创建的索引包含多个列,那么在执行查询的过程中,从索引的最左列开始,并且不跳过某一列,依次查询。如果中间有跳过的,那么索引将部分失效(从跳过的开始后面的不再生效)

范围查询

联合索引中出现范围查询(<,>),范围查询的右侧的列索引失效。在进行sql语句编写的时候尽量还是使用>=,这样的符号,可以避免索引部分失效。

索引列运算

不要在包含索引的列上进行运算操作,索引会失效。

字符串不加引号

字符串类型字段使用时,不加引号,索引将失效

模糊查询

在执行模糊查询时,要遵循前不带%的原则,这样可以避免索引失效。

Mysql索引知识点汇总_索引失效_23

Mysql索引知识点汇总_使用索引注意点_24

or连接的条件

用or分隔开的条件,如果or前的条件中有索引,后面的列没有索引,那么涉及的索引都不会用到。

数据分布影响

如果Mysql评估使用索引比全表慢,就不会使用索引

sql提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。

Mysql索引知识点汇总_索引失效_25

覆盖索引

尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select。


知识小贴士:using index condition:查找使用了索引,但是需要回表查询数据using where; using index:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

前缀索引

当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘io,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

Mysql索引知识点汇总_使用索引注意点_26

单列索引与联合索引

  • 单列索引:即一个索引只包含单个列。
  • 联合索引:即一个索引包含了多个列。

在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,而非单列索引。

多条件联合查询时,MySQL优化器会评估哪个字段的索引效率更高, 会选择该索引完成本次查询。

索引设计原则

  • 针对于数据量较大,且查询比较频繁的表建立索引。
  • 针对于常作为查询条件(where)、排序(orderby)、分组(group by)操作的字段建立索引。
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
  • 如果是字符串类型的字段,字段的长度较长,可以针对字段的特点,建立前缀索引。
  • 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
  • 要控制索引的数量,索引并不是多多益善,索引越多,纳护索引结构的代价也就越大,会影响增删改的效率。
  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。
举报

相关推荐

0 条评论