我有这个查询:
SELECT Frage_ID FROM Session_Fragen WHERE (Userantwort1 = 0
AND Userantwort2 = 0 AND Userantwort3 = 0 AND Userantwort4 = 0
AND Userantwort5 = 0) AND Session_ID = 12946
ORDER BY Sessionfrage_ID ASC LIMIT 1;
表:Session_Fragen 大约有。 560.000 行(并且每天增加 1.000 到 4.000 行...)
上面的查询实际上需要 1.5 秒。
意识到这一点后,我尝试使用索引..
<小时/>SHOW INDEXES FROM Session_Fragen
给了我这个:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
Session_Fragen 0 PRIMARY 1 Sessionfrage_ID A 567108 NULL NULL BTREE
Session_Fragen 1 Frage_ID 1 Frage_ID A 2849 NULL NULL BTREE
<小时/>
当我使用EXPLAIN
时,响应是:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Session_Fragen index NULL PRIMARY 8 NULL 1 Using where
<小时/>
我不明白如何改进这个语句以加快速度。 除了索引之外还有其他可能性吗?
感谢大家的帮助!
编辑: 显示创建表Session_Fragen
表创建表
Session_Fragen 创建表 Session_Fragen
(
Sessionfrage_ID
bigint(20) NOT NULL AUTO_INCRMENT,
User_ID
int(11) NOT NULL,
SF_Timestamp
时间戳 NOT NULL DEFAULT CURRENT_TIMESTAMP,
Session_ID
int(11) NOT NULL,
Frage_ID
int(11) NOT NULL,
Userantwort1
tinyint(1) NOT NULL DEFAULT '0',
Userantwort2
tinyint(1) NOT NULL DEFAULT '0',
Userantwort3
tinyint(1) NOT NULL DEFAULT '0',
Userantwort4
tinyint(1) NOT NULL DEFAULT '0',
Userantwort5
tinyint(1) NOT NULL DEFAULT '0',
主键(Sessionfrage_ID
),
KEY Frage_ID
(Frage_ID
)
) ENGINE=MyISAM AUTO_INCRMENT=753863 默认字符集=utf8
最佳答案
您的 where
子句具有所有相等比较。尝试以下索引:
create index Session_Fragen_big_idx on Session_Fragen(Session_id, Userantwort1, Userantwort2, Userantwort3,
Userantwort4, Userantwort5, Sessionfrage_ID, Frage_ID
);
该索引完全“覆盖”了查询,因此可以使用它代替实际数据。我应该注意到,具有相似名称的多个列(Userantwort1
等)是一个坏兆头——即使我个人不理解列名称的含义。这通常表明您需要一个关联/连接表。
关于尽管有索引,MySQL 长查询语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21973345/