尽管有索引,MySQL 长查询语句

标签 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
<小时/>

我不明白如何改进这个语句以加快速度。 除了索引之外还有其他可能性吗?

感谢大家的帮助!

编辑: 显示创建表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/

相关文章:

mysql - 逐行合并两个子查询

php - 每个月的第一天只插入一次数据

mysql - 如何提高此查询的性能?

sql - 转换游戏!从 MySQL 到 PostgreSQL 的框架演变

php - 用唯一值更新 MYSQL 中的每一行

php - 如何将 mysql 数据库中的选定值与另一个表中的现有值进行比较?

sql - (Oracle) 使用分页查询时如何获取结果总数?

java - SQL - 锁定或不锁定 : selecting next unused code

java - 如果Oracle中不存在则创建一个表(使用Java)

PHP登录数据库连接错误