MySQL长查询语句索引
我有一个疑问:MySQL长查询语句索引,mysql,sql,Mysql,Sql,我有一个疑问: 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行(每天增加
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行(每天增加1000到4000行…)
上面的查询实际上需要1.5秒
在我意识到这一点后,我尝试使用索引
给我这个:
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
我想不出,如何改进这句话来加快速度。 除了索引,还有其他可能性吗 谢谢大家的帮助 编辑: 显示创建表会话\u Fragen 表创建表 会话\u Fragen创建表
会话\u Fragen
(
Sessionfrage\u ID
bigint(20)非空自动增量,
User\u ID
int(11)不为空,
SF_时间戳
Timestamp NOT NULL默认当前_时间戳,
Session\u ID
int(11)不为空,
Frage_ID
int(11)不为空,
Userantwort1
tinyint(1)非空默认值“0”,
Userantwort2
tinyint(1)不为空默认值“0”,
Userantwort3
tinyint(1)不为空默认值“0”,
Userantwort4
tinyint(1)不为空默认值“0”,
Userantwort5
tinyint(1)非空默认值“0”,
主键(Sessionfrage\u ID
),
按键Frage\u ID
(Frage\u ID
)
)ENGINE=MyISAM AUTO_INCREMENT=753863 DEFAULT CHARSET=utf8您的
where
子句具有所有相等比较。请尝试以下索引:
create index Session_Fragen_big_idx on Session_Fragen(Session_id, Userantwort1, Userantwort2, Userantwort3,
Userantwort4, Userantwort5, Sessionfrage_ID, Frage_ID
);
该索引完全“覆盖”了查询,因此可以使用它来代替实际数据。我应该注意到,拥有多个名称相似的列(
Userantwort1
等等)是一个坏兆头——即使我个人不理解这些列名称的含义。这通常意味着您需要一个关联/连接表。没有表结构很难猜测,如果您可以发布它,它可能有助于找到问题。在我看来,您的索引似乎还可以,因为您的where中有主键,MySQL通常应该能够返回righth行,我没有righth表结构,但在本例中,您可以看到优化器只是更改您的查询以返回所需的数据:
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
删除了sql server标记,因为问题是关于MySQL的。请发布
SHOW CREATE TABLE Session\u Fragen
的输出,好吗?添加了表结构Gordon Linoff的评论是正确的,我认为主键是Session\u Id而不是Sessionfrage\u Id,在会话Id上添加索引应该可以提高查询的性能。
select '3' AS `Frage_ID` from `test`.`Session_Fragen` where 1 order by '12946' limit 1