我有这个问题:
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
我无法弄明白,如何改进这句话以加快速度。 除了索引之外还有其他可能性吗?
谢谢大家的帮助!
编辑: SHOW CREATE TABLE Session_Fragen
表创建表
Session_Fragen CREATE TABLE Session_Fragen
(
Sessionfrage_ID
bigint(20)NOT NULL AUTO_INCREMENT,
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',
PRIMARY KEY(Sessionfrage_ID
),
KEY Frage_ID
(Frage_ID
)
)ENGINE = MyISAM AUTO_INCREMENT = 753863 DEFAULT CHARSET = utf8
答案 0 :(得分:1)
您的where
子句具有所有相等比较。请尝试以下索引:
create index Session_Fragen_big_idx on Session_Fragen(Session_id, Userantwort1, Userantwort2, Userantwort3,
Userantwort4, Userantwort5, Sessionfrage_ID, Frage_ID
);
此索引完全“覆盖”查询,因此可以使用它代替实际数据。我应该注意,拥有多个具有相似名称(Userantwort1
等等)的列是一个不好的标志 - 即使我个人不明白列名的含义。这通常表明您需要关联/联结表。
答案 1 :(得分:0)
如果没有表格结构,很难猜到,如果你可以发布它,则可以通过migth帮助找到问题。对我来说你的索引似乎没问题,因为你的PRIMARY_KEY在你的位置,MySQL应该能够正常地返回行,我没有rigth表结构,但是在这个例子中,你可以看到Optimizer是只需更改查询即可返回所需数据:
EXPLAIN EXTENDED
SELECT Frage_ID FROM Session_Fragen WHERE (Userantwort1 = 0
AND Userantwort2 = 0 AND Userantwort3 = 0 AND Userantwort4 = 0 ) AND Session_ID = 12946
ORDER BY Session_ID ASC LIMIT 1;
SHOW WARNINGS
将改为
select '3' AS `Frage_ID` from `test`.`Session_Fragen` where 1 order by '12946' limit 1