mysql 执行优化

骑牛上青山
  • 1.1k

数据库有这么一张表格User以及一张用户的日志表User_log
想要根据日志查询用户于是有了这么一个sql

SELECT * FROM (SELECT * FROM User_log Order By create_time LIMIT 0, 50) JOIN User ON User.user_id=User_log.user_id

这个sql的思路是由于User表很大,所以直接子查询先查出50条log然后连表查到用户信息,但是结果发现效率有问题,explain之后发现mysql的执行顺序没有像我想象的一样先查出50条再join而是先join了再去查,导致User表被遍历了一遍。请问这是为什么?

PS:

1.mysql版本5.6.16
2.同样的sql在测试环境上不会有这种情况,测试环境mysql版本5.6.33
3.把log表换成其他的有些表就不会出现以上的问题,但是有一部分表就是会有问题
回复
阅读 922
3 个回答

根据你上面的 sql 根本就不能实现根据 log 查询 user 吧

SELECT * FROM user WHERE user_id in 
  (
    SELECT user_id FROM user_log ORDER BY create_time LIMIT 0, 50
  )

这样应该能满足你的需求吧

不明白你说的“User表被遍历了一遍”是什么意思,指的是全表扫描吗?

把explain的结果,表的索引、数据量都列出来吧,否则没办法判断执行计划是否合理。
理论上如果user表的记录不多,使用全表扫描也很正常。

Houis
  • 2
新手上路,请多包涵

连接:http://www.runoob.com/mysql/m...
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

你知道吗?

宣传栏