2010-03-04 83 views
0
$offset = SELECT FLOOR(RAND() * COUNT(*)) FROM t_table 
SELECT * FROM t_table WHERE LIMIT $offset,1 

的MyISAM的伟大工程,但我想这个表更改为InnoDB的(所有其他数据库表是InnoDB的)拿外国键的优点,避免表级别锁定。随机行查询优化

此表的primaryId字段是VARCHAR(10)

我不能“强制”数字AUTOINC标识,因为记录被删除/添加了所有的时间和随机(MIN(ID) MAX(Id))预测可能会错过很多次。

我该如何优化这个查询到innodb?

在此先感谢!
Arthur

回答

0

这不适合你吗?

SELECT * FROM t_table ORDER BY RAND() LIMIT 1 
+0

这是我第一次尝试,但表变得更大,我不得不用问题上的查询替换它 – arthurprs 2010-03-04 23:23:26

0

“SELECT * FROM t_table ORDER BY RAND()LIMIT 1”

这是行不通的,因为MySQL将检查所有谁符合条件(在这里没有条件的行,因此将采取一切行),他们将复制临时表中的行,然后将选择一个随机行