索引使用及SQL编写规范
索引失效:
1.索引中不能有列的值时null所以is null或者not null索引不起作用
2.单独引用符合索引中非第一位置的索引列:比如索引是a b c,那么a/a b/c不行
3.对索引列运算包括(+、-、*、/、!、<>、%、like‘%_’(%放在前面)、or、in、exist等)
4.对索引内部应用比如:select * from table_A where ROUND(id)=1此时应该建ROUND(id)为索引。
5.类型错误,如字段类型为varchar,where条件用number
6.当or条件时,必须所有的条件都是独立索引才能走索引
7.mysql查询只能使用一个索引,如果where中已经使用了索引,那么order by中就无法使用。 Select * from table_A where ID=x and number=y 如果这里的ID和number都建立了独立索引,只能走第一个ID。想继续提高速度只能建立组合索引。
不适合建立索引:
1.频繁更新的字段
2.where条件用不到的字段
3.表数据比较少的字段
4.数据重复且发布比较均匀的字段(唯一性较差的字段不适合建立索引)
5.参与计算的列不适合建立索引
必须加索引的:
1.主键自动建立唯一索引
2.频繁作为where条件语句查询的字段
3.关联字段需要建立索引,比如join on的字段
4.排序字段可以建立索引
5.分组字段可以建立索引,因为分组的前提是排序
6.统计字段,聚合函数可以建立索引,count() max()等
SQL编写规范
a)禁止使用SELECT *,只获取必要的字段,需要显示说明列属性。
b)禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性。
c)禁止使用属性隐式转换,例如:SELECT uid FROM t_user WHERE phone=13800000000 会导致全表扫描,而不能命中phone索引。
d)禁止在WHERE条件的属性上使用函数或者表达式:SELECT uid FROM t_user WHERE from_unixtime(day)>=‘2020-06-25’ 会导致全表扫描,正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp(‘2020-06-25 00:00:00’)
e)禁止使用负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描。
f)禁止使用%开头的模糊查询,会导致全表扫描。
g)禁止大表使用JOIN查询,或使用子查询:会产生临时表,消耗较多内存与CPU,极大影响数据库性能。