数据库优化方案Word下载.docx
《数据库优化方案Word下载.docx》由会员分享,可在线阅读,更多相关《数据库优化方案Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
索引用于快速找到特定一些值的记录。
如果没有索引,MySQL就必须从第一行记录开始读取整个表来检索记录。
表越大,资源消耗越大。
如果在字段上有索引的话,MySQL就能很快决定该从数据文件的哪个位置开始搜索记录,而无须查找所有的数据。
如果表中有1000条记录的话,那么这至少比顺序地读取数据快100倍。
注意,如果需要存取几乎全部1000条记录的话,那么顺序读取就更快了,因为这样会使磁盘搜索最少。
以下是是否使用索引的对比:
不使用索引查询用时:
0.0022秒
使用索引查询用时:
0.0012秒
所以相比较快了:
0.001秒,节省了一半时间,当数据更大的时候将节省更多时间。
2.尽量少使用or,而是以unionall代替
当where
子句中存在多个条件以“或”并存的时候,MYSQL的优化器并没有很好的解决其执行计划优化问题,再加上MYSQL特有的SQL与storage分层架构方式,造成了其性能比较低下,很多时候使用unionall或者union(必要的时候)的方式代替“or、”会得到更好地效果。
而union和unionall的差异主要是前者需要将两个(或多个)结果集合合并后再进行唯一性过滤操作,这就会涉及到排序,增加cpu运算,加大资源消耗及延迟。
所以当我们可以确定不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用unionall而不是union。
一下是3者的用时对比:
使用or用时:
0.0010秒
使用unionall用时:
0.0016秒
使用union用时:
0.0119秒
这与预期结果不符,这是因为与要查询的数据量有关系,在大量的数据查询时使用unionall查询速度最快,当数据量小的时候,就像正在使用的数据库只有100行,所以or最快,这些优化也要看数据量的大小,不然将会适得其反。
3.对where语句进行优化
1.删除where语句里面不必要的括号
比如:
((name='
北京大学'
)or(name='
深圳大学'
))
name='
orname='
加括号与去掉括号相差0.0002秒
2.常数调入:
(a<
bANDb=c)ANDa=5
b>
5ANDb=cANDa=5
使用优化后相差10倍多
3.删除常数条件:
(B>
5ANDB=5)OR(B=6AND5=5)OR(B=7AND5=6)
B=5ORB=6
相差1秒
4.当查询最少需要一行数据的时候使用limit1
当查询表的时候,你已经知道结果只会有一条结果的时候,但因为你可能需要去fetch游标,或是你也许去检查换回的记录数。
在这种情况下,加上limit1可以增加性能。
这样一来,mysql数据库引擎只需要找到一条符合的数据就可以停止搜索,而不是继续往后查找下一条符合记录的数据。
因为数据没有重复问题有相差,0.0001秒,速度提升不明显