索引

一:索引类型

  1. 普通索引
  2. 唯一索引
  3. 主键索引
  4. 组合索引
  5. 全文索引

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

原文地址:https://www.cnblogs.com/bulrush/p/12534081.html