索引语法

--创建索引
create [unique|fulltext] index index_name on table_name(index_col_name,...)
--查看索引
show index from table_name;
--删除索引
drop index index_name on table_name;

 

性能分析

  • 慢查询日志
    记录了所有执行时间超过指定参数的所有SQL语句的日志,默认未开启
  • profile详情
    帮助我们了解时间都耗费到哪里去了

explain执行计划

        获取MySQL如何执行select语句的信息,包含在select语句执行中表如何连接和连接的顺序

        explain 各字段的含义:

  1. ID:查询的序列号,表示了查询中执行select子句或者操作表的顺序;ID相同自上而下,ID不同 值越大越先执行
  2. select_type:表示select的类型,常见的取值有simple(简单表),primary(主查询),union(union中第二个或更后边的查询语句),subquery(select/where之后包含了子查询);
  3. type:表示连接类型 由好到差:null-system-const-eq_ref-ref-range-index-all
  4. possible_key:表示可能用到的索引
  5. key:实际用到的索引
  6. key_len:表示索引中使用的字节数,该值为最大可能的长度并非实际使用长度
  7. rows: MySQL认为必须要执行查询的行数
  8. filtered:返回结果的行数占需读取行数的百分比,越大越好

最左前缀法则

如果索引了多列(联合索引),要遵循最左前缀法则。

即查询从索引的最左列开始,并且不跳过索引中的列;若跳过某一列,索引将部分失效(缺失部分的后边)。

范围查询

联合索引中,出现范围查询(> <),范围查询右侧的列索引失效

索引列运算

不要在索引列上进行运算操作,否则索引会失效

字符串不加引号

字符串类型字段使用时不加引号,索引也会失效

模糊查询

如果是尾部模糊匹配索引不会失效,如果是头部模糊查询 索引会失效

or连接条件

如果or在前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到

数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引