实践中如何优化MySQL(建议收藏!)( 三 )


2.不在索引列上做任何操作
(计算、函数、(自动or手动)类型转换) , 会导致索引失效而转向全表扫描 。
3.存储引擎不能使用索引中范围条件右边的列 。
如这样的sql: select * from user where username='123' and age>20 and phone='1390012345',其中username, age, phone都有索引 , 只有username和age会生效 , phone的索引没有用到 。
4.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致))
如select age from user减少`select *``
5.mysql在使用不等于(!= 或者 <>)的时候无法使用索引会导致全表扫描 。
6.is null, is not null 也无法使用索引 , 在实际中尽量不要使用null 。
7.like 以通配符开头(‘%abc..’)mysql索引失效会变成全表扫描的操作 。
所以最好用右边like 'abc%' 。 如果两边都要用 , 可以用select age from user where username like '%abc%',其中age是必须是索引列 , 才可让索引生效
假如index(a,b,c), where a=3 and b like 'abc%' and c=4 , a能用 , b能用 , c不能用 , 类似于不能使用范围条件右边的列的索引
对于一棵B+树来讲 , 如果根是字符def , 如果通配符在后面 , 例如abc% , 则应该搜索左面 , 例如efg% , 则应该搜索右面 , 如果通配符在前面%abc , 则不知道应该走哪一面 , 还是都扫描一遍吧 。
8.字符串不加单引号索引失效
9.少用or , 用它来连接时会索引失效
10.尽量避免子查询 , 而用join
11、在组合索引中 , 将有区分度的索引放在前面
如果没有区分度 , 例如用性别 , 相当于把整个大表分成两部分 , 查找数据还是需要遍历半个表才能找到 , 使得索引失去了意义 。
12、避免在 where 子句中对字段进行 null 值判断
对于null的判断会导致引擎放弃使用索引而进行全表扫描 。
【实践中如何优化MySQL(建议收藏!)】如果觉得本文对你有帮助 , 可以点赞关注支持一下


推荐阅读