问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql 优化sql方法有哪些

发布网友 发布时间:2022-04-07 18:43

我来回答

1个回答

热心网友 时间:2022-04-07 20:12

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

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

5.下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
若要提高效率,可以考虑全文检索。

6.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num

8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2

9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

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

11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(...)

13.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)

14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...每次文字比较多超出屏幕大小就不知道怎么截屏,求教大佬! 我国政策性 广西明士清医疗器械有限公司怎么样? 广西禾力药业有限公司怎么样? 广西龙母圣商贸有限公司怎么样? 安徽合肥有什么去痔的好地方 我女朋友的谷丙转氨酶过高(达到121),而且两对半检测为阴性,是肝功能有... 泸州丽人女子医院开展科室 自由之子本次世界杯是否将在小组赛中被菜? 世界杯谁会嬴 叶圣陶的稻草人的燕子的名人名言? 世上无法解释的真实离奇的巧合都有哪些 梦见乞丐抢了我的肉饼,怎么解? 叶圣陶燕子是谁为燕子拭去血污? 《稻草人燕子》读后感是什么? 稻草人全文? 梦见死人被剁成肉饼 明末秦淮名妓,国学大师曾为其作传 削字的来历? 稻草人燕子内容 梦见自己被火车碾死,后来复活看着一大群人被火车碾成肉饼,这个梦是什么意思,代表什么吗 小天鹅洗衣机不通电是什么原因,按电源键没任何反应,外部电正常。 做梦梦见汽车撞死三个人是什么意思? 梦见自己用挖机将面包车里的几个仇人压成了肉饼? 做梦梦见汽车把人轧死 吓死我了 做过两会这样的梦了 到底什么意思阿... 徐霞客游记主要是中国哪方面的知识 周公解梦把人砸成肉饼是好梦还是差梦? 徐霞客传 原文 小天鹅全自动洗衣机不通电怎么回事 梦见故意开车把人压成肉饼 文档被锁定只读怎么办 如何查找自己的 怎么查看自己? 如何查看自己 如何查看自己名下的 怎么查看自己的码与密码? 原木家具到底好在哪里?原木家具适合新中式风格吗? 原木+新中式是最自然纯粹的美吗? 怎么看自己的? 怎么知道自己的是多少 怎么查看自己的码与密码? 怪不得越来越多的人喜欢原木风,它给人怎样的独特居住体验? 怎么查看自己的用了多久 年轻人装修的时候,原木简约风格真的适合吗? 集亭新中式原木家居饰品,性价比如何? 哪个新中式家具品牌能够体现木材的原生质感? 明灯三千,花开满城是什么意思? 花冠武神和太子悦神图片的区别 8G内存配8核CPU可以吗,四核呢? 联想M4000t四核能带动8G内存条吗?