| [yejr@imysql]> select id from t_innodb_random where id = round(rand()*(select max(id) from t_innodb_random))G Empty set (0.27 sec) |
可以看到,执行计划依然是全索引扫描,执行耗时也基本相当。
3、改造成普通子查询模式 ,这里有两次子查询
| [yejr@imysql]> explain select id from t_innodb_random where id = (select round(rand()*(select max(id) from t_innodb_random)) as nid)G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: t_innodb_random type: index possible_keys: NULL key: idx_id key_len: 4 ref: NULL rows: 393345 Extra: Using where; Using index *************************** 2. row *************************** id: 3 select_type: SUBQUERY table: NULL type: NULL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL Extra: Select tables optimized away |
| [yejr@imysql]> select id from t_innodb_random where id = (select round(rand()*(select max(id) from t_innodb_random)) as nid)G Empty set (0.27 sec) |
可以看到,执行计划也不好,执行耗时较慢。
4、改造成JOIN关联查询,不过最大值还是用常量表示
| [yejr@imysql]> explain select id from t_innodb_random t1 join (select round(rand()*13241324) as id2) as t2 where t1.id = t2.id2G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: <derived2> type: system possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1 Extra: *************************** 2. row *************************** id: 1 select_type: PRIMARY table: t1 type: ref possible_keys: idx_id key: idx_id key_len: 4 ref: const rows: 1 Extra: Using where; Using index *************************** 3. row *************************** id: 2 select_type: DERIVED table: NULL type: NULL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL Extra: No tables used |
| [yejr@imysql]> select id from t_innodb_random t1 join (select round(rand()*13241324) as id2) as t2 where t1.id = t2.id2G Empty set (0.00 sec) |
这时候执行计划就非常完美了,和最开始的常量等值查询是一样的了,执行耗时也非常之快。
这种方法虽然很好,但是有可能查询不到记录,改造范围查找,但结果LIMIT 1就可以了:










