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 如何优化?

优化思想:先查询admin中id大于10的,成一个虚拟表,再通过此虚拟表中的id与log进行连接查询
优化为: select * from (select  *  from admin where admin_id>10) T1 lef join log on T1.admin_id =log.admin_id。
使用 JOIN 时候,应该用小的结果驱动大的结果(left join 左边表结果尽量小如果有条件应该放到左边先处理,right join 同理反向),同时尽量把牵涉到多表联合的查询拆分多个 query(多个连表查询效率低,容易到之后锁表和阻塞)。
3、limit 的基数比较大时使用 between
例如:select * from admin order by admin_id limit 100000,10
优化为:select * from admin where admin_id between 100000 and 100010 order by admin_id。
4、尽量避免在列上做运算,这样导致索引失效
例如:select * from admin where year(admin_time)>2014
优化为: select *  from admin where admin_time>'2014-01-01′
5、当得知查询到只有一条数据时,使用limit  0;去终结查询。

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、为什么不要使用身份证作为主键。:一般主键是有序的,若很多用户的身份证不仅仅无序,索引依照主键存储,当存储之后,由于无序,很可能发生叶节点的大量计算和创建。

 

 
posted @ 2019-12-02 11:09  愤青程序猿  阅读(169)  评论(0编辑  收藏  举报