MySQL 索引详解大全

时间:2021-07-30 08:09:14

什么是索引?

1、索引
  索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。

2.

索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。

索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度
索引的优点是可以提高检索数据的速度
索引的缺点是创建和维护索引需要耗费时间
索引可以提高查询速度,会减慢写入速度

索引分类

1.普通索引
    2.唯一索引
    3.全文索引
    4.单列索引
    5.多列索引
    6.空间索引
    7.主键索引
    8.组合索引

  • 普通索引:仅加速查询
  • 唯一索引:加速查询 + 列值唯一(可以有null)
  • 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null)
  • 组合索引:多列值组成一个索引,
                  专门用于组合搜索,其效率大于索引合并
  • 全文索引:对文本的内容进行分词,进行搜索

索引合并,使用多个单列索引组合搜索
覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖

如何创建索引?记住一个单词---explain

创建表的时候创建索引

    CREATE TABLE tbl_name(
字段名称 字段类型 [完整性约束条件],
,,,,
[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY[索引名称](字段名称[(长度)])
[ASC|DESC]
);

在已经存在的表上创建索引:

    .CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名称 ON 表名{字段名称[(长度)] [ASC|DESC]}
.ALTER TABLE tbl_name ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX索引名称(字段名称[(长度)][ASC|DESC]);

如何删除索引?

DROP INDEX 索引名称 ON tbl_name

1.普通索引

普通索引仅有一个功能:加速查询

create table in1(
nid int not null auto_increment primary key,
name varchar() not null,
email varchar() not null,
extra text,
index ix_name (name)
)

创建表+索引

create index index_name on table_name(column_name)

创建索引

drop index_name on table_name;

删除索引

show index from table_name;

查看索引

注意:对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length。

create index ix_extra on in1(extra());

2、唯一索引

唯一索引有两个功能:加速查询 和 唯一约束(可含null)

create table in1(
nid int not null auto_increment primary key,
name varchar() not null,
email varchar() not null,
extra text,
unique ix_name (name)
)

创建表+唯一索引

create unique index 索引名 on 表名(列名)

创建唯一索引

drop unique index 索引名 on 表名

删除唯一索引

3、主键索引

主键有两个功能:加速查询 和 唯一约束(不可含null)

create table in1(
nid int not null auto_increment primary key,
name varchar() not null,
email varchar() not null,
extra text,
index ix_name (name)
) OR create table in1(
nid int not null auto_increment,
name varchar() not null,
email varchar() not null,
extra text,
primary key(ni1),
index ix_name (name)
)

创建表+创建主键

alter table 表名 add primary key(列名);

创建主键

alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;

删除主键

4、组合索引

组合索引是将n个列组合成一个索引

其应用场景为:频繁的同时使用n列来进行查询,如:where n1 = 'alex' and n2 = 666。

create table in3(
nid int not null auto_increment primary key,
name varchar() not null,
email varchar() not null,
extra text
)

创建表

create index ix_name_email on in3(name,email);

创建组合索引

如上创建组合索引之后,查询:

  • name and email  -- 使用索引
  • name                 -- 使用索引
  • email                 -- 不使用索引

注意:对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并。

相关命令

- 查看表结构
desc 表名 - 查看生成表的SQL
show create table 表名 - 查看索引
show index from 表名 - 查看执行时间
set profiling = 1;
SQL...
show profiles;

使用索引和不使用索引

由于索引是专门用于加速搜索而生,所以加上索引之后,查询效率会快到飞起来。

# 有索引
mysql> select * from tb1 where name = 'wupeiqi-888';
+-----+-------------+---------------------+----------------------------------+---------------------+
| nid | name | email | radom | ctime |
+-----+-------------+---------------------+----------------------------------+---------------------+
| | wupeiqi- | wupeiqi888@live.com | 5312269e76a16a90b8a8301d5314204b | -- :: |
+-----+-------------+---------------------+----------------------------------+---------------------+
row in set (0.00 sec) # 无索引
mysql> select * from tb1 where email = 'wupeiqi888@live.com';
+-----+-------------+---------------------+----------------------------------+---------------------+
| nid | name | email | radom | ctime |
+-----+-------------+---------------------+----------------------------------+---------------------+
| | wupeiqi- | wupeiqi888@live.com | 5312269e76a16a90b8a8301d5314204b | -- :: |
+-----+-------------+---------------------+----------------------------------+---------------------+
row in set (1.23 sec)

正确使用索引

数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。
即使建立索引,索引也不会生效:

- like '%xx'
select * from tb1 where name like '%cn';
- 使用函数
select * from tb1 where reverse(name) = 'wupeiqi';
- or
select * from tb1 where nid = 1 or email = 'seven@live.com';
特别的:当or条件中有未建立索引的列才失效,以下会走索引
select * from tb1 where nid = 1 or name = 'seven';
select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex'
- 类型不一致
如果列是字符串类型,传入条件是必须用引号引起来,不然...
select * from tb1 where name = 999;
- !=
select * from tb1 where name != 'alex'
特别的:如果是主键,则还是会走索引
select * from tb1 where nid != 123
- >
select * from tb1 where name > 'alex'
特别的:如果是主键或索引是整数类型,则还是会走索引
select * from tb1 where nid > 123
select * from tb1 where num > 123
- order by
select email from tb1 order by name desc;
当根据索引排序时候,选择的映射如果不是索引,则不走索引
特别的:如果对主键排序,则还是走索引:
select * from tb1 order by nid desc; - 组合索引最左前缀
如果组合索引为:(name,email)
name and email -- 使用索引
name -- 使用索引
email -- 不使用索引

其他注意事项

- 避免使用select *
- count(1)或count(列) 代替 count(*)
- 创建表时尽量时 char 代替 varchar
- 表的字段顺序固定长度的字段优先
- 组合索引代替多个单列索引(经常使用多个条件查询时)
- 尽量使用短索引
- 使用连接(JOIN)来代替子查询(Sub-Queries)
- 连表时注意条件类型需一致
- 索引散列值(重复少)不适合建索引,例:性别不适合

limit分页

无论是否有索引,limit分页是一个值得关注的问题

aaarticlea/png;base64,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" alt="" />

aaarticlea/png;base64,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" alt="" />

每页显示10条:
当前 , 倒序:
大 小 下一页: select
*
from
tb1
where
nid < (select nid from (select nid from tb1 where nid < 当前页最小值 order by nid desc limit 每页数据 *【页码-当前页】) A order by A.nid asc limit )
order by
nid desc
limit ; select
*
from
tb1
where
nid < (select nid from (select nid from tb1 where nid < order by nid desc limit ) A order by A.nid asc limit )
order by
nid desc
limit ; 上一页: select
*
from
tb1
where
nid < (select nid from (select nid from tb1 where nid > 当前页最大值 order by nid asc limit 每页数据 *【当前页-页码】) A order by A.nid asc limit )
order by
nid desc
limit ; select
*
from
tb1
where
nid < (select nid from (select nid from tb1 where nid > order by nid asc limit ) A order by A.nid desc limit )
order by
nid desc
limit ;

执行计划

explain + 查询SQL - 用于显示SQL执行信息参数,根据参考信息可以进行SQL优化

mysql> explain select * from tb2;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| | SIMPLE | tb2 | ALL | NULL | NULL | NULL | NULL | | NULL |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
row in set (0.00 sec)
id
查询顺序标识
如:mysql> explain select * from (select nid,name from tb1 where nid < ) as B;
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
| | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | | NULL |
| | DERIVED | tb1 | range | PRIMARY | PRIMARY | | NULL | | Using where |
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
特别的:如果使用union连接气值可能为null select_type
查询类型
SIMPLE 简单查询
PRIMARY 最外层查询
SUBQUERY 映射为子查询
DERIVED 子查询
UNION 联合
UNION RESULT 使用联合的结果
...
table
正在访问的表名 type
查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
ALL 全表扫描,对于数据表从头到尾找一遍
select * from tb1;
特别的:如果有limit限制,则找到之后就不在继续向下扫描
select * from tb1 where email = 'seven@live.com'
select * from tb1 where email = 'seven@live.com' limit ;
虽然上述两个语句都会进行全表扫描,第二句使用了limit,则找到一个后就不再继续扫描。 INDEX 全索引扫描,对索引从头到尾找一遍
select nid from tb1; RANGE 对索引列进行范围查找
select * from tb1 where name < 'alex';
PS:
between and
in
> >= < <= 操作
注意:!= 和 > 符号 INDEX_MERGE 合并索引,使用多个单列索引搜索
select * from tb1 where name = 'alex' or nid in (,,); REF 根据索引查找一个或多个值
select * from tb1 where name = 'seven'; EQ_REF 连接时使用primary key 或 unique类型
select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid = tb1.nid; CONST 常量
表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次。
select nid from tb1 where nid = ; SYSTEM 系统
表仅有一行(=系统表)。这是const联接类型的一个特例。
select * from (select nid from tb1 where nid = ) as A;
possible_keys
可能使用的索引 key
真实使用的 key_len
MySQL中使用索引字节长度 rows
mysql估计为了找到所需的行而要读取的行数 ------ 只是预估值 extra
该列包含MySQL解决查询的详细信息
“Using index”
此值表示mysql将使用覆盖索引,以避免访问表。不要把覆盖索引和index访问类型弄混了。
“Using where”
这意味着mysql服务器将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引。
“Using temporary”
这意味着mysql在对查询结果排序时会使用一个临时表。
“Using filesort”
这意味着mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成。
“Range checked for each record(index map: N)”
这个意味着没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列中索引的位图,并且是冗余的。

执行计划

慢日志查询

a、配置MySQL自动记录慢日志

slow_query_log = OFF                            是否开启慢日志记录
long_query_time = 2 时间限制,超过此时间,则记录
slow_query_log_file = /usr/slow.log 日志文件
log_queries_not_using_indexes = OFF 为使用索引的搜索是否记录

注:查看当前配置信息:
       show variables like '%query%'
     修改当前配置:
    set global 变量名 = 值

b、查看MySQL慢日志

mysqldumpslow -s at -a  /usr/local/var/mysql/MacBook-Pro-3-slow.log

"""
--verbose 版本
--debug 调试
--help 帮助 -v 版本
-d 调试模式
-s ORDER 排序方式
what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time
-r 反转顺序,默认文件倒序拍。reverse the sort order (largest last instead of first)
-t NUM 显示前N条just show the top n queries
-a 不要将SQL中数字转换成N,字符串转换成S。don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN 正则匹配;grep: only consider stmts that include this string
-h HOSTNAME mysql机器名或者IP;hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup script)
-l 总时间中不减去锁定时间;don't subtract lock time from total time
"""

参数详解