对于数据库而言,只要做好数据存储工作就行了,但对于SQL而言,执行效率是很重要的指标。目前主流的关系型数据库都自带了查询分析器和优化器,能自动对我们编写的SQL进行最优处理,即便如此,SQL执行慢的现象还是不可避免的。虽说SQL语句执行慢是大家经常遇到的,但背后原因并不简单。
这一点很重要,SQL语句执行速度偶尔慢和一直慢的背后因素是不同的,自然要分场景来分析问题。
如果一条SQL语句绝大多数情况下都是正常的,偶尔出现慢的情况,那一般来说此SQL语句问题不大,可能是其它因素影响了它的执行效率,比如:
1、服务器内存不足
若查询量大,而查询的数据页又不在内存中时,就需要申请内存,此时一旦内存不足就会淘汰一些内存数据,这些操作就会影响SQL执行速度。
2、日志文件过大
数据库在同步日志及数据到磁盘上时,也会影响SQL执行效率。
3、无法获取锁
当我们在操作数据时,若别人也在用这张表而且加锁了,我们无法获取到锁,只能等待他人释放锁,这个很影响SQL效率。
如果数据量级不变,而某条SQL执行时一直都很慢,那就需要看看SQL语句写法是否存在问题了,另外数据库的一些配置是否存在问题,比如:
1、相关字段是否建有合适的索引?
比如更新操作,如果加了where条件,而条件列字段没有索引,那就意味着要全表扫描,这样一来SQL慢也就是正常现象了。
2、字段有索引,但SQL并没有用到此索引
并不是说我们对字段创建了索引,索引就一定会生效。在某些情况下,一些SQL写法会导致索引失效,比如在索引列上使用了函数。
3、系统采样统计失误导致系统没有使用索引而是全表扫描,此时需要强制使用索引
SQL执行时,数据库系统会进行一个预测:看是走索引扫描的行数少,还是全表扫描的行数少。索引基数是通过采样来统计的,存在一定误差,如果误差过大那可能会使系统错误的决定使用全表扫描,此时我们可以在SQL中声明强制走索引查询。
4、硬件限制
如果服务器CPU及磁盘读写速度低、内存小,那同样会影响整个数据库性能。