mysql 语句优化
发布网友
发布时间:2022-04-07 19:45
我来回答
共2个回答
热心网友
时间:2022-04-07 21:15
从句子中可以看到,选取的字段比较多,另外连接条件也比较多,另外还包括了子查询。
就此语句给出几个需要注意的问题:
1、请先使用explain,对这个语句进行分析,EXPLAIN解释SELECT命令如何被处理。这不仅对决定是否应该增加一个索引,而且对决定一个复杂的Join如何被MySQL处理都是有帮助的。
2、尽量在连接条件多的时候,把数据提取量少的条件放在前面,这样会减少后一个条件的查询时间。对了,这些经常用的连接条件最好建上索引。我不清楚
INNER JOIN table_user_profile AS up ON up.uid = u.uid
INNER JOIN table_user_count AS uc ON uc.uid = u.uid
INNER JOIN table_user_daren AS ud ON ud.uid = u.uid
这些那个先内连接数据比较少,自己排列一下试一试。
3、避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据。像in和not in这样的关键字用exists和not exists比较好。u.uid not in(SELECT uid FROM table_user_follow where f_uid=100)改成u.uid not exists(SELECT uid FROM table_user_follow where f_uid=100),效率会有提高。
4、mysql使用函数的时候会增加负担,完全可以交给脚本程序去解决。比如此子查询:
SELECT MAX(share_id) FROM table_share 完全可以不写在这个sql语句中,交给脚本程序可以了。追问你好,我不太懂mysql,语句是参照sql server写的。语句未经过优化,这个应该是可以换一个思路写一个简单的语句的,主要实现的核心是 一个用户表 一个用户分享表,提取用户信息,但是用户信息是根据用户分享表里的分享时间来排序的,用户表和用户分享表是一对多的关系。
追答用户表和用户分享表是一对多的关系,只需要两个表就行啊,最多三个表就好,怎么语句当中出现了六个表呢?估计是数据库设计出了问题,要不不会用到连接这么多表,复杂点的三个表见过,还没见过这么多表参与连接查询的呢。能否告知这六个表(table_share,table_user,
table_user_profile,table_user_count,table_user_daren,table_user_follow)的物理意义?球球号联系吧,这里面太麻烦了。我的球球号是八七三七四二五一三。
热心网友
时间:2022-04-07 22:33
针对语句。前提是数据比较多,少的话加不加没关系。首先基本的on条件做索引,up.uid什么的加上。还有你的not in 改了,改成left jion的方式,意思就是left jion (SELECT uid FROM table_user_follow where f_uid=100)t on u.uid=t.uid 之后再加个条件是 t.uid is null 。其他的看情况考虑是否加联合索引。