索引语法
--创建索引
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 各字段的含义:
- ID:查询的序列号,表示了查询中执行select子句或者操作表的顺序;ID相同自上而下,ID不同 值越大越先执行
- select_type:表示select的类型,常见的取值有simple(简单表),primary(主查询),union(union中第二个或更后边的查询语句),subquery(select/where之后包含了子查询);
- type:表示连接类型 由好到差:null-system-const-eq_ref-ref-range-index-all
- possible_key:表示可能用到的索引
- key:实际用到的索引
- key_len:表示索引中使用的字节数,该值为最大可能的长度并非实际使用长度
- rows: MySQL认为必须要执行查询的行数
- filtered:返回结果的行数占需读取行数的百分比,越大越好
最左前缀法则
如果索引了多列(联合索引),要遵循最左前缀法则。
即查询从索引的最左列开始,并且不跳过索引中的列;若跳过某一列,索引将部分失效(缺失部分的后边)。
范围查询
联合索引中,出现范围查询(> <),范围查询右侧的列索引失效
索引列运算
不要在索引列上进行运算操作,否则索引会失效
字符串不加引号
字符串类型字段使用时不加引号,索引也会失效
模糊查询
如果是尾部模糊匹配索引不会失效,如果是头部模糊查询 索引会失效
or连接条件
如果or在前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到
数据分布影响
如果MySQL评估使用索引比全表更慢,则不使用索引