一:索引类型
- 普通索引
- 唯一索引
- 主键索引
- 组合索引
- 全文索引
1:直接创建普通索引
1 create index index_lname on person (lname);
2:创建唯一索引
1 create unique index person_index_unique_fname on sql_test.person (fname);
3:主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引:
4:组合索引
create index person_index_fname_age on person (fname, age);
5:全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
开启慢日志查询
1 show variables like 'slow_query%'; 2 show variables like 'long_query_time';
3 set global slow_query_log='ON'; 开启慢日志查询
4 set global long_query_time=1; 设置慢日志时间
查询SQL执行时间
1 show profiles; 2 开启 3 show variables like '%pro%'; 4 set profiling = 'ON'
使用explain去分析SQL语句
使用到索引
1 explain select * from person 2 where fname like 'q%' and age>10;
没有使用到索引
1 explain select * from person 2 where fname like '%q%' and age>10;
概要描述:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明
覆盖索引
再来看看什么是覆盖索引,有下面三种理解:
- 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
- 解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫 做覆盖索引。
- 解释三:是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。
不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引
当发起一个被索引覆盖的查询(也叫作索引覆盖查询)时,在EXPLAIN的Extra列可以看到“Using index”的信息
explain select lname from person where 1=1 and lname='Dave'
explain select lname from person where 1=1 and id=999998