mysql SQL优化琐记之索引
equal最好了,其次in,最后是range
!= <> 这类非操作尽量不用,它会转换为range。
>都是范围查询
复合索引有左匹配原则,(clo_a,clo_b)相当建立了两个索引
(clo_a,clo_b)
clo_a,
加索引前,最好在相同数据量的测试环境下,测试。 最好用线上的,怕造的数据有数据倾斜,造成数据选择性不高。
有分隔符的复杂索引,可以考虑前辍索引或复合索引
数据库增加索引操作
虽然,mysql声称5.7版本后,支持在线ddl且不锁表,但是,执行效率,还是没有pt-online-schema-change工具快
pt-online-schema-change工具不会有任何锁表的情况,因为,它的原理是新复制一张临时表,表结构和旧表一样,然后添加索引,把数据迁移到新临时表中,并且,还有3个触发器分别记录dml操作。最后,数据复制完成,2张表rename互换即可
使用online DDL模式,最稳妥,但需要安装online工具,得有权限。否则只能用普通DDL模式蛋疼的操作了
执行时间和数据量成正比,只不过是锁的时间会比较短,获取DML锁就可以了 后续还有一个锁的时间和增量数据有关
备注:
只读库如果只是高并发的读操作,产生的是共享乐观锁,一般情况下,只读库很少出现死锁。如果出现象上次那种大批量的慢查询sql,客户端发起读请求,服务端未能及时返回数据,导致客户端一直连续发送请求时,可能会出现阻塞等待。