1、索引

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

2、索引种类

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

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

3、相关命令

 1 - 查看表结构
 2     desc 表名
 3  
 4 - 查看生成表的SQL
 5     show create table 表名
 6  
 7 - 查看索引
 8     show index from  表名
 9  
10 - 查看执行时间
11     set profiling = 1;
12     SQL...
13     show profiles;

4、使用索引和不使用索引

 1 由于索引是专门用于加速搜索而生,所以加上索引之后,查询效率会快到飞起来。
 2  
 3 # 有索引
 4 mysql> select * from tb1 where name = 'wys-66';
 5 +-----+--------+----------------+----------------------------------+---------------------+
 6 | nid | name   | email          | radom                            | ctime               |
 7 +-----+--------+----------------+----------------------------------+---------------------+
 8 | 67  | wys-66 | wys66@live.com | 5312269e76a16a90b8a8301d5314204b | 2017-06-13 15:41:35 |
 9 +-----+--------+----------------+----------------------------------+---------------------+
10 1 row in set (0.00 sec)
11  
12 # 无索引
13 mysql> select * from tb1 where email = 'wys66@live.com';
14 +-----+--------+----------------+----------------------------------+---------------------+
15 | nid | name   | email          | radom                            | ctime               |
16 +-----+--------+----------------+----------------------------------+---------------------+
17 | 67  | wys-66 | wys66@live.com | 5312269e76a16a90b8a8301d5314204b | 2017-06-13 15:41:35 |
18 +-----+--------+----------------+----------------------------------+---------------------+
19 1 row in set (1.23 sec)

5、正确使用索引

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

 1 - like '%xx'
 2     select * from tb1 where name like '%cn';
 3 - 使用函数
 4     select * from tb1 where reverse(name) = 'wupeiqi';
 5 - or
 6     select * from tb1 where nid = 1 or email = 'seven@live.com';
 7     特别的:当or条件中有未建立索引的列才失效,以下会走索引
 8             select * from tb1 where nid = 1 or name = 'seven';
 9             select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex'
10 - 类型不一致
11     如果列是字符串类型,传入条件是必须用引号引起来,不然...
12     select * from tb1 where name = 999;
13 - !=
14     select * from tb1 where name != 'alex'
15     特别的:如果是主键,则还是会走索引
16         select * from tb1 where nid != 123
17 - >
18     select * from tb1 where name > 'alex'
19     特别的:如果是主键或索引是整数类型,则还是会走索引
20         select * from tb1 where nid > 123
21         select * from tb1 where num > 123
22 - order by
23     select email from tb1 order by name desc;
24     当根据索引排序时候,选择的映射如果不是索引,则不走索引
25     特别的:如果对主键排序,则还是走索引:
26         select * from tb1 order by nid desc;
27  
28 - 组合索引最左前缀
29     如果组合索引为:(name,email)
30     name and email       -- 使用索引
31     name                 -- 使用索引
32     email                -- 不使用索引
View Code

相关文章: