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 -- 不使用索引