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查询)会导致不能使用索引。

         9. SELECT 子句中避免使用"*"。 因为用"*",数据库会将"*"依次解析为所有的字段名,这个工作是通过查询数据字典完成的,这就意味着会消耗更多的时间。

        10. 规范所有SQL的大小写。比如SELECT ,UPDATE,DELETE,FROM 等,要么全部用大写,要么全部用小写。

 

三、 在数据库中条件查询速度很慢的时候,如何优化?

        1. 为经常出现在WHERE子句中的列建立索引。

        2.为经常出现在ORDER BY , DISTINCT后面的字段建立索引。

        3.如果建立的是复合索引,索引的字段顺序要和这些关键字后的字段的顺序保持一致。

        4.为经常作为表的连接条件的字段建立索引。

        5. 减少表之间的关联。

        6. 优化sql。尽量让sql尽快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面。

        7.简化查询字段,没用的字段不要,对返回结果进行控制,尽量少返回数据。

发布了53 篇原创文章 · 获赞 45 · 访问量 8805

猜你喜欢

转载自blog.csdn.net/qq_33036061/article/details/104523657