先前一直对sql语句优化没有太在乎,最近网站用户量增加,发现数据库压力很大自己写的语句啊,新来的架构师对我们语句一一优化,我总结如下(不断更新。。。)
(1)
优化前的语句:
# Query_time: 5.967435 Lock_time: 0.000129 Rows_sent: 1 Rows_examined: 803401
SET timestamp=1286843575;
select livemessag0_.id as id38_, livemessag0_.isactive as isactive38_, livemessag0_.content as content38_, livemessag0_.createtime as createtime38_, livemessag0_.userid as userid38_, livemessag0_.objectid as objectid38_, livemessag0_.recordid as recordid38_, livemessag0_.type as type38_ from live_message livemessag0_ where (livemessag0_.objectid in (select livescrip1_.id from live_scrip livescrip1_ where livescrip1_.senderid='ff8080812aebac2d012aef6491b3666d')) and livemessag0_.type=2 limit 6;
优化后的语句:
select livemessag0_.id as id38_,
livemessag0_.isactive as isactive38_,
livemessag0_.content as content38_,
livemessag0_.createtime as createtime38_,
livemessag0_.userid as userid38_,
livemessag0_.objectid as objectid38_,
livemessag0_.recordid as recordid38_,
livemessag0_.type as type38_
from live_scrip livescrip1_ left join
live_message livemessag0_
on livescrip1_.id=livemessag0_.objectid
where livescrip1_.senderid = 'ff8080812aebac2d012aef6491b3666d' and
livemessag0_.type = 2
limit 6;
总结:尽量少用子查询用表连接的方式代替(如果表连接不是太复杂的话),这样优化后大概能减少1/3的时间,后来发现livemessag0_.objectid竟然没有建立索引,晕菜
(2)
优化前的慢查询:
SELECT r1.id,r1.username,r1.nickname,r1.img_name,r1.datecreated FROM acegi_users AS r1 JOIN (SELECT ROUND(RAND() *(SELECT MAX(num_id) FROM acegi_users)) AS id) AS r2 WHERE r1.num_id >= r2.id and r1.id not in(select r.user_id from user_relations r where r.relation_user_id='ff8080812ad5ad7f012ad5aee5150005') and r1.id!='ff8080812ad5ad7f012ad5aee5150005' and r1.role='expert' ORDER BY r1.num_id limit 3;
优化后的sql:
SELECT r1.id,
r1.username,
r1.nickname,
r1.img_name,
r1.datecreated
FROM acegi_users AS r1
JOIN
(SELECT ROUND(RAND() *(SELECT MAX(num_id) FROM acegi_users)) AS id) AS r2
WHERE r1.num_id >= r2.id
and
not EXISTS (select r0.user_id from (select r.user_id from user_relations r where
r.relation_user_id = 'ff8080812ad5ad7f012ad5aee5150005' union select 'ff8080812ad5ad7f012ad5aee5150005') r0 where r0.user_id=r1.id)
and
r1.role = 'expert'
ORDER BY r1.num_id
limit 3;
总结:少用not in 用not EXISTS代替之
分享到:
相关推荐
SQL语句优化总结,很实用,讲解详细,适用于新手,用于平时工作中
sql语句优化PPT,总结基本常见的,自己总结的
SQL语句优化总结,数据库常用优化策略。
常用的ORACLE SQL语句优化总结,提高效率,节省资源~
对SQL语句的各种情况下的优化,包括索引的使用,子查询的优化并涉及SQL执行编译的原理
利用ALTER INDEX语句中的REBUILD选项,可以使用已有索引而不是表来快速重建索引。在执行这个操作时必须要有足够的空间来保存所有的索引。
2023最新mysql的sql语句优化方法技巧面试题总结.docx2023最新mysql的sql语句优化方法技巧面试题总结.docx2023最新mysql的sql语句优化方法技巧面试题总结.docx2023最新mysql的sql语句优化方法技巧面试题总结.docx2023...
ORACLE数据库SQL语句编写优化总结文档
oracle的SQL语句调优总结,Oracle语句优化53个规则详解。
mysql的sql语句优化方法面试题总结.docxmysql的sql语句优化方法面试题总结.docxmysql的sql语句优化方法面试题总结.docxmysql的sql语句优化方法面试题总结.docxmysql的sql语句优化方法面试题总结.docx
sql语句优化
精通SQL语句的优化学习总结精通SQL语句的优化学习总结
sql优化总结,针对一般sql语句的优化编写进行总结整理,有助于形成良好的sql语句书写习惯
ORACLE数据库SQL语句编写优化总结
客服业务受到SQL语句的影响非常大...本次秘笈根据实际的工作经验,在研发原来已有的方法的基础上,进行了一些扩充,总结了基于索引的SQL语句优化的降龙十八掌,希望有一天你能用其中一掌来驯服客服业务中横行的‘恶龙’
sql语句总结具体介绍优化sql语句总结具体介绍优化sql语句总结具体介绍优化
NULL 博文链接:https://huangtut.iteye.com/blog/285494
客服业务受到SQL语句的影响非常大...本次秘笈根据实际的工作经验,在研发原来已有的方法的基础上,进行了一些扩充,总结了基于索引的SQL语句优化的降龙十八掌,希望有一天你能用其中一掌来驯服客服业务中横行的‘恶龙’
本文档主要介绍与SQL调整有关的内容,内容涉及多个方面:SQL语句执行的过程、ORACLE优化器,表之间的关联,如何得到SQL执行计划,如何分析执行计划等内容,从而由浅到深的方式了解SQL优化的过程,使大家逐步步入SQL...
ORACLE数据库SQL语句编写优化总结