从句子中可以看到,选取的字段比较多,另外连接条件也比较多,另外还包括了子查询。
就此语句给出几个需要注意的问题:
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语句中,交给脚本程序可以了。
我帮你执行了一下,结果是,这两条select语句都没有使用索引。具体看下图。
至于原因,t表没有创建主键。创建了主键后,执行结果就不一样。