语句优化有那些方法? 查询速度很慢应该怎么办?"/>
MySQL中exists关键字和in的区别有那些? SQL语句优化有那些方法? 查询速度很慢应该怎么办?
一、exists和in有何区别如下?
exists使用循环的方式,由outer表的记录数决定循环的次数,对于exists的影响最大,所以,外表的记录越小,子查询结果集较大时适用于exists; in 先执行子查询,子查询的结果返回去重之后,再执行主查询,所以,子查询的返回结果越少,越适合使用in关键字。
二、SQL语句的优化方式有那些?
1. 尽量避免非操作符的使用。在索引列上用NOT,<>等非操作符会导致索引失效,数据库管理系统是不会使用索引的,可以将查询语句转换为可以使用索引的查询。
2. 避免对查询列的操作。任何对查询列的操作都有可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等,插叙时,尽可能将操作移至等式的右边,甚至去掉函数。
3. 避免不必要的类型转换。需要注意的是,尽量避免潜在的数据类型转换,如将字符型数据与数值类型数据进行比较,会自动将字符转换,导致全表扫描。
4. 增加查询的范围限制。 避免全范围的检索。
5. 合理使用IN与exists关键字。 它们的使用情况如下:
1) 当只显示一个表的数据A,关系条件只有一个ID时,使用IN更适合。 sql为:
select * from A where id in (select id from B)
2) 当只显示一个表的数据A, 关系条件不只一个列,例如关系条件涉及到ID,col1,子查询较大时,用exists比较适合。sql为:
select * from A where exists (select 1 from id=A.id and col1=A.col1)
6. 适当建立索引。对于关联查询时,适当建立索引,可以提升查询效率,但mysql一个表索引的数量不宜超过16个,过多会占用较多磁盘资源。
7. 尽量去掉<> 。尽量去掉<>,避免全表扫描,如果数据是枚举值,且取值范围同定,则修改为OR或者IN a<>0 改为 a>0 OR a<0。
8.尽量不要使用前导模糊查询。由于前导模糊查询(%的like查询)会导致不能使用索引,可以通过explain关键字来查看索引的使用情况。
9. SELECT 子句中避免使用"*"。 因为用"*",数据库会将"*"依次解析为所有的字段名,这个工作是通过查询数据字典完成的,这就意味着会消耗更多的时间。
10. 规范所有SQL的大小写。比如SELECT ,UPDATE,DELETE,FROM 等,要么全部用大写,要么全部用小写。
三、 在数据库中条件查询速度很慢的时候,如何优化?
1. 为经常出现在WHERE子句中的列建立索引。
2.为经常出现在ORDER BY , DISTINCT后面的字段建立索引。
3.如果建立的是复合索引,索引的字段顺序要和这些关键字后的字段的顺序保持一致,最左索引匹配原则。
4.为经常作为表的连接条件的字段建立索引。
5. 减少表之间的关联。
6. 优化sql。尽量让sql尽快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面。
7.简化查询字段,没用的字段不要,对返回结果进行控制,尽量少返回数据。
8. 避免使用字段is null或者not null 判断,这样会导致索引失效。可以给对应的索引字段添加一个默认值,如:
select num from user where num is not null;
// num本来是加了索引的,但是因为判断为null,导致全盘扫描, 因此我们可以给num赋一个默认0,判断where num >0 or num <0
更多推荐
MySQL中exists关键字和in的区别有那些? SQL语句优化有那些方法? 查询速度很慢应该怎么办?
发布评论