自然连接
内连接
外连接
对所有的字段都建立索引是否合适?
单值索引
唯一索引
复合索引
为什么MySQL要用B+树作为索引呢?
hash索引:如果只查找单个值,其效率会非常高,但是hash索引有几个问题:(1)不支持排序(2)不支持范围查询(3)不支持最左匹配原则
B树索引:B树的非叶子节点存放了数据记录的地址,会导致存放的节点更少,树的层数变高,范围查找是需要做局部的中序遍历(B+树的叶子节点就是存放的记录本身,并且是一个有序的链表)
红黑树:作为二叉树,层数高,涉及到磁盘操作是,每次向下查找就会涉及一次I/O,效率不高
需要建立
不需要建立
1.表记录太少(300W+就需要考虑了)
2.经常增删改
3.数据重复且分布平均
4.where条件中用不到的字段
5.频繁更新的字段
join场景优化
避免索引失效
1.全值匹配
2.最佳左前缀法则
如果索引了多列(复合索引),实际上创了多个索引,例如索引(a,b,c),实际创建了(a),(a,b),(a,b,c)三个索引,所以如果想使用该复合索引,则需要在where中同时使用三个字段检索,或前两个,不能跳着用,带头大哥不能丢
组合索引底层还是采取的B+树,并且还是只有一棵树,只是树中节点的排序是先按照第一个排序,在第一个元素相同的情况下再看第二个元素,依次类推,因此才有了最左前缀匹配,如果跳过第一个元素,直接去通过第二三个元素过滤是无法做到的
3.不在索引列上做任何操作(函数、计算、转变类型),会导致索引失效
4.存储引擎不能使用范围条件右边的列,这是指复合索引条件下,例如检索a,b,c;但是b使用了范围条件,这个时候就只能使用range,且key_len显示只包括了(a,b),而不是(a,b,b),但是当还存在一个单值索引(c),这个时候type会变成ref,且使用的索引为(c),而不是那个复合索引
5.尽量使用复合索引
6.使用!=或<>会无法使用索引,导致全表扫描
7.is null或者is not null 也无法使用索引
8.like以通配符开头(%xxxx)会导致索引失效,导致全表扫描
9.字符串不加单引号,索引失效
10.少用or,用它连接会导致索引失效
针对order by和group by的特殊处理
一般性建议
exist与in
结论:
(1)尽量使用index(扫描有序索引排序)方式排序,避免使用filesort(文件排序)
(2)尽可能在索引列上完成排序操作,遵照索引建的最左前缀
(3)如果不在索引列上,filesort有两种算法,双路排序,单路排序
(4)优化策略
Update your browser to view this website correctly. Update my browser now