如何查询慢 SQL 产生的原因
l 分析 SQL 执行计划(explain extended),思考可能的优化点,是否命中索引等。
l 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)。
l 内存不足。 l 网络速度慢。
l 是否查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。
l 是否返回了不必要的行和列。
l 锁或者死锁。
l I/O 吞吐量小,形成了瓶颈效应。
l sp_lock,sp_who,活动的用户查看,原因是读写竞争资源
索引失效的情况有哪些?
l like 以%开头索引无效,当 like 以&结尾,索引有效。
l or 语句前后没有同事使用索引,当且仅当 or 语句查询条件的前后列均为索引时,索引 生效。
l 组合索引,使用的不是第一列索引时候,索引失效,即最左匹配规则。
l 数据类型出现隐式转换,如 varchar 不加单引号的时候可能会自动转换为 int 类型,这 个时候索引失效。
l 在索引列上使用 IS NULL 或者 IS NOT NULL 时候,索引失效,因为索引是不索引空值 得。
l 在索引字段上使用,NOT、 <>、!= 、时候是不会使用索引的,对于这样的处理只会进 行全表扫描。
l 对索引字段进行计算操作,函数操作时不会使用索引。
l 当全表扫描速度比索引速度快的时候不会使用索引
对 SQL 慢查询会考虑哪些优化 ?
l 分析语句,是否加载了不必要的字段/数据。
l 分析 SQL 执行计划(explain extended),思考可能的优化点,是否命中索引等。
l 查看 SQL 涉及的表结构和索引信息。
l 如果 SQL 很复杂,优化 SQL 结构。
l 按照可能的优化点执行表结构变更、增加索引、SQL 改写等操作。
l 查看优化后的执行时间和执行计划。
l 如果表数据量太大,考虑分表。
l 利用缓存,减少查询次数。
性能优化的8种方法
一、设置索引
二、使用EXPLAIN 来查看你的 SELECT 查询
三、不要使用表达式作为查询条件
四、尽量使用in运行符来替代or运算 子查询表大的用exists,子查询表小的用in
In用的是主表上的索引,exists用的是子表上的索引
五、条件列表值如果连续使用between替代in
六、无重复记录的结果集使用union all合并
七、使用like操作符时通配符要放在右侧
八、数据库怎么优化查询效率?
分表分库,主从。
对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫
描
应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
Update 语句,如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志
对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差。