浙江建设厅网站首页,福州网站建设推广平台,中国域名网站排名,做单页网站要多少钱文章目录一、使用explain进行分析二、如何优化数据的访问三、如何重构大查询一、使用explain进行分析
Explain 用来分析 SELECT 查询语句#xff0c;开发人员可以通过分析 Explain 结果来优化查询语句。
比较重要的字段有#xff1a;
select_type : 查询类型#xff0c;有…
文章目录一、使用explain进行分析二、如何优化数据的访问三、如何重构大查询一、使用explain进行分析
Explain 用来分析 SELECT 查询语句开发人员可以通过分析 Explain 结果来优化查询语句。
比较重要的字段有
select_type : 查询类型有简单查询、联合查询、子查询等 key : 使用的索引 rows : 扫描的行数
二、如何优化数据的访问
减少请求的数据量 只返回必要的列最好不要使用 SELECT * 语句。 只返回必要的行使用 LIMIT 语句来限制返回的数据。 缓存重复查询的数据使用缓存可以避免在数据库中进行查询特别在要查询的数据经常被重复查询时缓存带来的查询性能提升将会是非常明显的减少服务器端扫描的行数 最有效的方式是使用索引来覆盖查询
三、如何重构大查询
切分大查询 一个大查询如果一次性执行的话可能一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。
DELETE FROM messages WHERE create DATE_SUB(NOW(), INTERVAL 3 MONTH);rows_affected 0
do {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 tag
JOIN tag_post ON tag_post.tag_idtag.id
JOIN post ON tag_post.post_idpost.id
WHERE tag.tagmysql;优化后的查询是:
SELECT * FROM tag WHERE tagmysql;
SELECT * FROM tag_post WHERE tag_id1234;
SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);