mysql进阶,索引的基础和优化
索引是什么:排好序的快速查找数据结构
索引语句
创建
CREATE INDEX indexName ON mytable(columnname(length));
ALTER mytable ADD INDEX ON (columnname(length))
删除
DROP INDEX ON mytable;
显示索引情况
SHOW INDEX FROM table_name
需要创建索引的情况:
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- 频繁更新的字段不适合创建索引(每次更新不单单更新了记录还会更新索引,加重io负担)
- where条件里用不到的字段不创建索引
- 单值/组合索引选择问题(高并发下倾向创建组合索引)
- 查询中排序的字段,排序字段若通过索引区访问将大大提高排序速度
- 查询中统计或者分组字段
explian:查询sql的问题
explian属性的介绍
id:select查询的***。
- id相同,执行顺序由上到下
- id不同,如果是子查询,id的序号会递增,id值越大优先级越高
- id有相同有不同,相同,执行顺序由上到下。不同,,id值越大优先级越高
select_type:查询类型,主要用于区别普通查询、联合查询、子查询等的复杂查询
table:显示这一行的数据是关于哪张表的
type:使用哪种情况排序
最好到最差排序依次:
system>const>eq_ref>ref>range>index>ALL
一般优化至少达到range级别,最好达到ref
possible_keys:可能用到的索引
key:实际用到的索引
key_len:索引中使用的字节数,在保证精度的前提下,越短越好
ref:索引的那一列或常量被使用了
rows:找出记录所需读取的行数
extra:额外信息
其中比较重要的信息:
using filesort:mysql查询过程中使用了内部排序,查询中要避免出现。
using temporary:mysql查询过程中产生了临时表,查询中要避免出现。
using index 查询中使用了覆盖索引
覆盖索引:一个索引包含(或覆盖)所有需要查询的字段的值
索引优化
单表健索引:
多用用复合索引来取代单值索引
两表建索引:
小表建索引
三表建索引:
用小结果集驱动大结果集
索引失效:
小记:
带头大哥不能死,中间兄弟不能断,索引列上无计算,like%加右边,范围之后全失效,字符串里有引号