存储形式分类:
回表查询:先根据二级索引拿到对应的信息,就是下面这张图中存储的黄色部分,然后根据拿到的信息去聚集索引中查询数据
如果不指定唯一或者全文索引,那么默认为常规索引
一个索引只应用到一个字段称为单列索引,应用到多列称为联合索引或组合索引
查看MySQL执行频率
慢查询日志:P76,可以将查询比较慢的sql语句记录下来,定义比较慢的sql需要自己设定秒数,生成一个日志,以此来优化sql,但默认是关闭的
profile只能看到每条sql的执行时间,而explain能看到执行顺序,类型等,只需要在select前加explain就行
额外关注type, possible_key, key, key_len
联合索引的最左前缀法则: 只要查询条件包含索引即可,不计较位置
最好使用大于等于,大于等于不会失效
索引失效情况:
不要使用一些函数
因为头部模糊匹配将会进行全表扫描,因此索引失效
sql提示:提示mysql使用哪个索引,因为一个字段可能包含多个索引,因此需要提示mysql使用哪个,use index是推荐mysql使用这个索引,而force是强制使用这个索引
黄色部分是explain中的额外信息
覆盖索引:不需要进行回表查询的索引(个人理解)
1.为username建立单列索引,有一定的优化,但查询中包含passwor,还需要进行回表查询
2.为username与password建立联合索引,这个联合索引为二级索引,因为二级索引叶子节点中包含了id的聚集索引,因此不需要为id建立联合索引,因此这个索引不需要进行回表查询
count(distinct name):对name字段进行去重统计
前缀索引:
推荐使用联合索引,如果使用两个单列索引,那么mysql会根据性能只选择其中的一个,因此使用联合索引更好
使用联合索引有顺序需要考虑,因为有最左前缀法则,并且联合索引当中的排序是通过最左边的那个顺序依次排序