- 积分
- 44
- UID
- 13661
- 阅读权限
- 10
- 注册时间
- 2013-4-28
- 精华
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 职业
- 1
|
项目中遇到一段SQL语句类似如下:- SELECT
- *
- FROM
- `table1`
- WHERE uid IN(
- SELECT
- uid
- FROM
- `table2`
- WHERE
- time >= '2013-04-26 17:00:00'
- AND time <= '2013-04-27 17:00:00'
- AND owner_uid = 1
- ) AND a.owner_uid IN (1)
- LIMIT 0, 20;
复制代码 其中table1建了唯一索引- UNIQUE KEY `owner_uid` (`owner_uid`,`uid`)
复制代码 table1和table2都是百万级别的表,但子查询的结果非常小,大概只有50条记录左右。
如果将子查询改为实际的记录,SQL如下:- SELECT
- *
- FROM
- `table1`
- WHERE uid IN(
- 1, 2, 3, ... , 50
- ) AND a.owner_uid IN (1)
- LIMIT 0, 20;
复制代码 则查询效率很高,大概0.07秒就能完成。如果用最开始的SQL语句则需要2.5秒左右才能完成,如果单独执行子查询也只需要0.9秒。请问是什么原因导致的,如何优化?
|
|