我得到了这个查询工作,但它真的很慢。MySQL查询缓慢运行
我想用以下查询:1随机(id,word,meaning)
和1随机不正确任何其他词的含义。如何通过我的查询获得更好的性能?
$offset_result = mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM words WHERE APPROVAL=1 AND PERIOD<".$_SESSION['statistics']['d']." OR (PERIOD=".$_SESSION['statistics']['d']." AND WEEK<=".$_SESSION['statistics']['h'].")");
$offset_row = mysql_fetch_object($offset_result);
$offset = $offset_row->offset;
$words = mysql_query("SELECT ID,WORD,MEANING,
(SELECT MEANING FROM words WHERE ID!=w.ID AND APPROVAL=1 AND WORD!=w.WORD AND NOT FIND_IN_SET(w.MEANING, OTHER_MEANING) AND ID >= (SELECT FLOOR(MAX(ID) * RAND()) FROM words) ORDER BY ID LIMIT 1) AS INCORRECT
FROM words w
LIMIT $offset, 1");
这里是表格布局
CREATE TABLE words (
ID int(11) NOT NULL AUTO_INCREMENT,
APPROVAL tinyint(1) NOT NULL DEFAULT '1',
WORD varchar(255) COLLATE utf8_turkish_ci NOT NULL,
MEANING varchar(255) COLLATE utf8_turkish_ci NOT NULL,
OTHER_MEANING varchar(255) COLLATE utf8_turkish_ci NOT NULL,
PERIOD tinyint(1) NOT NULL,
WEEK tinyint(2) NOT NULL,
PRIMARY KEY (ID),
KEY APPROVAL (APPROVAL))
ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=769 ;
我不确定我完全理解了这个问题,但您可以使用SELECT ... ORDER BY RAND()LIMIT 1'从结果中获取一个随机行。 –
那你的数据库模式是什么,你设置了哪些索引? –
**您需要向我们展示表和索引定义。**诊断慢查询需要全表和索引定义,而不仅仅是描述或释义。也许你的表格定义不好。也许索引没有正确创建。也许你没有一个你认为你做过的那个专栏的索引。没有看到表和索引定义,我们不能说。如果你知道如何做一个'EXPLAIN'或者得到一个执行计划,那就把结果也放在问题中。 –