Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL长查询语句索引_Mysql_Sql - Fatal编程技术网

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