标签:驱动 between 大小 包括 相同 ref 设置 null 的区别
MySQL优化
-?将常用和有关系的字段放在相同的表中,把一张表的数据分成几张表
比如:?select 列 from 表 where age*2=36;? ?建议改成??select 列 from 表 where age=36/2;
②.?应尽量避免在 where 子句中使用?!=或<>?操作符,否则将引擎放弃使用索引而进行全表扫描。
③. 应尽量避免在 where 子句中对字段进行 null 值 判断
④.?应尽量避免在 where 子句中使用 or?来连接条件
很多时候用 exists 代替 in 是一个好的选择:如查询语句使用了not in那么内外表都进行全表扫描,没用到索引,而not exists子查询依然能用到表上索引,所以无论哪个表大,用not exists都比not in要快。
-?select num from a where num in(select num from b)
建议改成: select num from a where exists(select 1 from b where num=a.num)
区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题
一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的
假如表沒有主键(Primary key), 那么count(1)比count(*)快,
如果有主键的話,那主键作为count的条件时候count(主键)最快
如果你的表只有一个字段的话那count(*)就是最快的
count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column) 是不包括NULL的统计
标签:驱动 between 大小 包括 相同 ref 设置 null 的区别
原文地址:https://www.cnblogs.com/anliux/p/12853970.html