sql优化
1 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
其实对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说 它其实也是提供了explain这样的命令可以便于查询sql的执行计划,并且通过执行计划 我们能够看到sql的执行情况,包括是否使用索引,使用了什么样的索引,以及使用索引的一些相关信息
对于执行计划来说 它里面有几个非常关键的字段,
比如说有key字段,这个字段就表示是否用了索引,如果没用索引,key字段就为null;
同时还有type字段 它表示使用索引的类型,索引的效果从差到好一般是全表索引,–index全索引树扫描,–》range范围查询–》ref(使用非唯一索引进行查找数据)–》eq-ref(使用主键索引或者唯一索引关联等)
possible key 可能使用到的索引
key length 索引的长度
extra信息,比如说有 using index,using where
2 大表数据的查询如何进行优化?
1 首先对于大表数据,第一个思路还是说优化sql+去使用索引
2. 使用缓存–如果说已经优化了sql,还可以通过使用缓存,将一些不会发生变化的比如配置信息,历史数据信息放到缓存redis中去
3. 其次还可以做主从复制,读写分离,将大量的查询操作通过读库完成
4. 做垂直拆分,也就是按照模块之间的耦合度将系统和数据拆分成更细粒度
5. 做水平拆分, 这一步就需要选择一个合适的sharing key,同时为了有更好的查询效率,表结构也要有改动,应用也要改动,注意sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表
3 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
其实在业务系统的开发中 我除了使用主键进行查询以外,别的其实都是会在测试库上查看对应的耗时和执行效率
而我们系统的慢查询统计都是运维在做的,他们会通过邮件或者短信电话等方式推送和反馈给我们
针对于慢查询的sql分析,我们一般的操作其实是从三方面入手,就是明确慢查询的原因到底是什么?是没有走索引?还是load了过多不需要的数据,还是表的数据量过大导致的
而这三个方向 也有对应的处理方式
1 首先我们拿到sql会看下当前load的数据中有没有多余字段,如果说是因为load了多余的行导致的查询过慢 我们就优化sql,进行重写
2 其次看下有没有走索引,就是通过分析sql的执行计划,获取索引的使用情况,如果说没有走索引,就修改语句,尽量去命中索引
3 如果对语句的优化已经无法进行&