sql,explain

2,3调转了,先on相同的行,再join另外的行,后面where ,有时候on会放在where,效率沒有那么高

 https://www.cnblogs.com/jalja/p/7670712.html

1,join on得等于条件写在where一样,都是一个primary(type=eq_ref),一个外键

1,如果一个left join那就是全表扫瞄

2,主键查找,一般都是const

3,主键>那种,一般都是range

4,刚好覆盖索引,type=index,不加where那种,全一个索引

5,in查询在沒有命中的情况下是rang,沒有是all

6,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。

7,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20

8,不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒)
SELECT * FROM record WHERE amount/30< 1000 (11秒)
SELECT * FROM record WHERE convert(char(10),date,112)=’19991201’ (10秒)
分析:
WHERE子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:
SELECT * FROM record WHERE card_no like ‘5378%’ (< 1秒)
SELECT * FROM record WHERE amount< 1000*30 (< 1秒)
SELECT * FROM record WHERE date= ‘1999/12/01’ (< 1秒)

猜你喜欢

转载自www.cnblogs.com/vhyc/p/12240582.html