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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. MySQL删除百万级别或以上的数据可以使用分批次删除的方式,每次删除一定数量的数据,可以通过LIMIT关键字限制删除的数据行数。另外,可以使用批量更新的方式将要删除的数据标记为已删除状态,然后再定期执行一次物理删除操作。 2. IN和EXISTS都是用于子查询的操作符。IN是用于查找指定列的某个值是否在子查询返回的结果集出现过,而EXISTS则是判断子查询返回的结果集是否非空。通常情况下,使用EXISTS比IN更高效。 3. FLOAT和DOUBLE都是用于表示浮点数的数据类型,其FLOAT占用4个字节,DOUBLE占用8个字节。DOUBLE的精度比FLOAT更高,但是FLOAT的计算速度比DOUBLE更快。 4. UNION和UNION ALL都是用于合并结果集的操作符。区别在于,UNION会去除重复的行,而UNION ALL会保留重复的行。因此,如果需要合并结果集并去重,可以使用UNION;如果不需要去重,则可以使用UNION ALL。 5. SQL的生命周期包括五个阶段:需求分析、概要设计、详细设计、编码与测试、维护。在需求分析阶段,需要确定数据库的需求和规格;在概要设计阶段,需要设计数据库的结构和关系;在详细设计阶段,需要确定数据库的具体操作和存储方式;在编码与测试阶段,需要编写SQL语句并进行测试;在维护阶段,需要对数据库进行维护和升级。 6. MySQL要尽量设定一个主键的原因是,主键可以唯一标识一条记录,方便对数据进行索引和查询操作。另外,主键还可以作为外键关联其他表,从而实现表之间的关联和查询。如果没有主键,查询操作可能会变得非常缓,影响数据库的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦钢铁侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值