7-6 如何确定查询处理各个阶段所消耗的时间

profile

7-6 如何确定查询处理各个阶段所消耗的时间_第1张图片
image.png

show profile for query 1;
7-6 如何确定查询处理各个阶段所消耗的时间_第2张图片
Sending data 消耗时间最多,可以用索引优化

show profile cpu for query 1;
cpu信息

profile 警告不推荐使用了

7-6 如何确定查询处理各个阶段所消耗的时间_第3张图片

推荐用 Performance Schema

Performance Schema

开启

UPDATE ‘setup_instruments‘ SET enabled='YES',TIMED='YES' WHERE NAME LIKE 'stage%';
UPDATE setup_consumers SET enabled='YES' WHERE NAME LIKE 'events%';

执行某个sql

7-6 如何确定查询处理各个阶段所消耗的时间_第4张图片
查询

7-6 如何确定查询处理各个阶段所消耗的时间_第5张图片
结果

实例

7-6 如何确定查询处理各个阶段所消耗的时间_第6张图片
然后暂停几秒给主从数据库提供同步的时间

7-6 如何确定查询处理各个阶段所消耗的时间_第7张图片
image.png

修改表结构

1.对字段类型/宽度修改 会锁表
2.主从数据库延迟
解决
1.切换到从服务器再改一次
2.建一新表,把老表数据同步过去,删除老表用新表重命名代替,好处是只在重命名时加一短暂的锁

7-6 如何确定查询处理各个阶段所消耗的时间_第8张图片
工具完成这一过程

alter 要做的修改 update 语句去掉(这里是把c列宽度改成150)
update 表名后的部分
user 用户名 D数据库名 t表名

not in <>

SELECT first_name
FROM customer

WHERE customer_id

NOT IN (
SELECT customer_id FROM payment
)

会多次对payment进行查询

SELECT a.first_name
FROM customer a
LEFT JOIN payment b ON a.customer_id =b.customer_id
WHERE b.customer_id IS NULL

改成LEFT JOIN 就一次了

汇总表优化

如 商品评论数 一般会写
SELECT COUNT(*) FROM product_comment WHERE product_id = 4687
不如建一个汇总表,凌晨时统计一次
CREATE TABLE product_comment_cnt(product_id INT ,cnt INT;
然后之前的查询变为

SELECT SUM(cnt) FROM (

SELECT cnt FROM product_comment_cnt WHERE product_id = 999
UNION ALL

SELECT COUNT(*) FROM product_comment WHERE product_id = 999
AND timestr>DATE(NOW0)

) a 

你可能感兴趣的