外观
1、 sql语句
select * 会导致查询速度变慢,要返回的字段越多,查询效率更低。优化:尽量用需要的字段来代替*,这样可以提高查询效率
两个表先进行自然连接,在进行where条件筛选出符合条件的记录会导致查询速度变慢。优化:可以在在进行连表查询查询的时候,进行先用where进行筛选出符合条件的记录,然后再进行连表操作
没有索引的时候都也可能会导致查询速度变慢,优化方式:在合适的列上建立索引,为什么说是合适的列呢,因为如果在性别这种大量重复值的字段上建立索引的话,并不能提高查询效率。如果某个字段是唯一性的,就可以直接创建唯一性索引,或者主键索引。这样可以更快速地通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段,为该字段建立唯一性索引可以很快确定某个学生的信息,如果使用姓名的话,可能存在同名现象,从而降低查询速度。索引尽量建立在where、Order by、group by 后面常用的条件列上面建立索引,也能提高查询速度。
大表查询会导致查询速度变慢,优化:将大表进行分割小表,然后进入某张小表进行查询,比如一张表有10万条记录而且他们的id都是从1-10万依次递增的,这时就可以根据id进行分成若干张小表。将id0-1万的记录放在第一张表,id1-2万放在另外一张小表,以此类推分割成十张小表,现在我想查询第5000条记录,就在第一张表进行查询即可
where 使用了in关键字进行查询,会导致查询速度变慢。优化方式:可以使用exist或者between代替in。
select num frim a where num in (select num from b)
用下面语句进行替换:
select num frm a where exists(select 1 from b where num =a.num)
select id from t where num in(1,2,3)
对于连续的数值,能用between就不要用in,改写如下:
select id from t where num between 1 and 3。
大事务会导致查询速度变慢,大事务是运行时间长,操作数据比较多的事务,因为事务具有acid的特性,所以大事务一旦开始执行时间就会很长。优化:将大事务分解成若干个事务,或是优化事务里面的sql语句。
where后面出现表达式或函数操作会导致查询速度下降,因为引擎放弃使用索引而进行全表查询。优化:将where后面的相关条件处理成常量等
如
如:select id from where num is null
或可以建表时设置num列的默认值是0,确保表中num列没有null值,然后可以这么查询:
select id from t where num=0。这样不会放弃索引
2、 其他因素
(1)数据库服务器内存不足,cpu性能较弱,都会导致数据查询变慢。优化:设置配置更高的服务器
(2)不同的数据库类型会影响查询效率,如MySQL这种存储在磁盘的数据库,每次都要去读取磁盘的数据所以查询速度较慢、而redis数据库都是内存数据库,内存的读取速度比磁盘的会更快,所以redis在一定程度上来说查询速度更快
(3)网络速度慢会导致查询速度变慢,因为数据库的服务器往往跟访问的地方不同,距离越远、网络环境传输速度慢,传输时间越长。优化:减少数据库服务器与实际访问的距离、优化网络传输环境
(4)磁盘 IO性能突然下降、大量消耗磁盘性能的计划任务导致数据库的查询效率下降。解决:更快磁盘设备、调整计划任务、做好磁盘维护。