使用 Explain 举行分析
Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。
比较重要的字段有:
- select_type : 查询类型,有简朴查询、团结查询、子查询等
- key : 使用的索引
- rows : 扫描的行数
- type :访问类型分列结果值最好到最差) system > const > eq_ref > ref > range > index > ALL
优化数据访问
- 只返回须要的列: 最好不要使用 SELECT * 语句。
- 只返回须要的行: 使用 LIMIT 语句来限制返回的数据。
- 缓存重复查询的数据: 使用缓存可以制止在数据库中举行查询,特别在要查询的数据经常被重复查询时,缓存带来的查询性能提升将会是非常明显的。
- 减少服务器端扫描的行数
- 最有效的方式是使用索引来覆盖查询。
重构查询方式
一个大查询假如一次性实行的话,可能一次锁住很多数据、占满整个事件日志、耗尽系统资源、阻塞很多小的但重要的查询。
- DELEFT FROM messages WHEREcreate< DATE_SUB(NOW(),INTERVAL3MONTH);
- rows_affected =0do { rows_affected = do_query("DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000") } while rows_affected 0
复制代码 将一个大毗连查询分解成对每一个表举行一次单表查询,然后将结果在应用程序中举行关联,这样做的好处有:
- 让缓存更高效。对于毗连查询,假如其中一个表发生变革,那么整个查询缓存就无法使用。而分解后的多个查询,即使其中一个表发生变革,对其它表的查询缓存依然可以使用。
- 分解成多个单表查询,这些单表查询的缓存结果更可能被其它查询使用到,从而减少冗余记录的查询。
- 减少锁竞争;
- 在应用层举行毗连,可以更轻易对数据库举行拆分,从而更轻易做到高性能和可伸缩。
- 查询自己效率也可能会有所提升。比方下面的例子中,使用 IN() 代替毗连查询,可以让 MySQL 按照 ID 顺序举行查询,这可能比随机的毗连要更高效。
- SELECT*FROM tab JOIN tag_post ON tag_post.tag_id=tag.id JOIN post ON tag_post.post_id=post.id WHERE tag.tag='mysql';
- SELECT*FROM tag WHERE tag='mysql';SELECT*FROM tag_post WHERE tag_id=1234;SELECT*FROM post WHERE post.id IN(123,456,567,9098,8904);
复制代码 慢SQL优化方案
冷热隔离
参考优易,冷热数据隔离,几乎不会再更新的数据和操纵频繁的订单数据分开
代码复杂度高,影响范围广
标签表-横表
orderId-tag1-tag2
字段较多,索引建不完
数据维护复杂度上升
标签表-纵表
orderId-tag1
orderId-tag2
多个标签与或非查询条件sql比较难写,性能也不太好评估
数据维护复杂度上升
订单表加索引
重新梳理一份索引
用工具导数据,然后停机,重建索引
欺压限制走某个索引
汗青数据
归档,现在1年
分库分表
店肆ID、堆栈ID
尽可能查询必要的数据
懒加载、必要的时候查询、前端冗余查询
列式数据库
ck
参考:
explain分析sql语句性能详解_explain sql-CSDN博客
MySQL索引原理及慢查询优化
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |