SQL优化

2021-01-03  本文已影响0人  HueyYao

SQL有索引但是执行效率还是很低

存在索引但是检索效率依旧慢的原因:

整理了集中日常使用过程中的优化问题(参考学习后做了总结)

第一种情况:

select * from t1 where date(c) ='2019-05-21';
优化后:
select * from t1 where c>='2019-05-21 00:00:00' and c<='2019-05-21 23:59:59';

类似求某一天或者某一个月数据的需求,建议写成类似上例的范围查询,可让查询能走索引。避免对条件索引字段做函数处理。

第二种情况:

select user_name,tele_phone from user_info where tele_phone =11111111111;
优化后:
select user_name,tele_phone from user_info where tele_phone ='11111111111';

隐式转换导致查询慢的情况在工作中遇到过几次,有时字段名对开发写SQL产生了影响,比如曾经遇到过字段名是user_num,而实际字段类型是char,但是开发在写SQL时误认为是int型,导致漏写单引号而发生隐式转换。所以建议在写SQL时,先看字段类型,然后根据字段类型写SQL。

第三种情况:

select * from t1 where a like '%1111%';
优化后:
select * from t1 where a like '1111%';

如果条件只知道中间的值,需要模糊查询去查,那就建议使用ElasticSearch或其它搜索服务器。

第四种情况:

select * from t1 where b>=1 and b <=2000;
优化后:
mysql> select * from t1 where b>=1 and b <=1000;
mysql> select * from t1 where b>=1001 and b <=2000;

实际这种范围查询而导致使用不了索引的场景经常出现,比如按照时间段抽取全量数据,每条SQL抽取一个月的;或者某张业务表历史数据的删除。遇到此类操作时,应该在执行之前对SQL做explain分析,确定能走索引,再进行操作,否则不但可能导致操作缓慢,在做更新或者删除时,甚至会导致表所有记录锁住,十分危险。

第五种情况:

select * from t1 where b-1 =1000;
优化后:
select * from t1 where b =1000 + 1;

一般需要对条件字段做计算时,建议通过程序代码实现,而不是通过MySQL实现。如果在MySQL中计算的情况避免不了,那必须把计算放在等号后面。

上一篇 下一篇

猜你喜欢

热点阅读