尽管索引,MySQL长查询语句

时间:2014-02-23 19:28:16

标签: 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行(并且每天增加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_IDFrage_ID) )ENGINE = MyISAM AUTO_INCREMENT = 753863 DEFAULT CHARSET = utf8

2 个答案:

答案 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