Mysql语句优化
1、比如 select id from t where num is null 这样的 sql 也是可以的。但是最好不要给数据库留 NULL,尽可能的使用 NOT NULL 填充数据库。不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了,不管是否插入值(NULL 也包含在内),都是占用 100 个字符的空间的,如果是 varchar 这样的变长字段,null 不占用空间。可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询:select id from t where num= 0。尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
2、select * from admin left join log on admin.admin_id= log.admin_id where log.admin_id>10 如何优化?
6、Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后。
7、用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。EXISTS会根据索引去进行判断是否存在,而IN和NOT IN 不会。但不全是,和数据库版本,存储引擎,数据量有关系,不能一概而论
8、避免在索引列上使用 IS NULL 和 IS NOT NULL
9、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
10、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
11、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
12、任何情况下都不要使用select * 不要返回无用的字段,且:当我们不使用* 去查询时,有可能会触发覆盖索引提高查询效率,
13、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
14、应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,使用合并多个查询结果
如:select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20
15、模糊查询中 like %zi %zi%,是不能使用索引的,索引只会根据左边的字段去查询。
16、为什么不要使用身份证作为主键。:一般主键是有序的,若很多用户的身份证不仅仅无序,索引依照主键存储,当存储之后,由于无序,很可能发生叶节点的大量计算和创建。