使用WHERE子句加速MySQL(MyISAM)COUNT

Ala*_*des 4 php mysql myisam count

我们正在实施一个分析书籍的系统.该系统是用PHP编写的,每本书都会循环显示单词并分析每个单词,从各种正则表达式和其他测试中设置某些标志(转换为数据库字段).

这会产生一个matches表,类似于下面的示例:

+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| id                     | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| regex                  | varchar(250) | YES  |     | NULL    |                |
| description            | varchar(250) | NO   |     | NULL    |                |
| phonic_description     | varchar(255) | NO   |     | NULL    |                |
| is_high_frequency      | tinyint(1)   | NO   |     | NULL    |                |
| is_readable            | tinyint(1)   | NO   |     | NULL    |                |
| book_id                | bigint(20)   | YES  |     | NULL    |                |
| matched_regex          | varchar(255) | YES  |     | NULL    |                |
| [...]                  |              |      |     |         |                |
+------------------------+--------------+------+-----+---------+----------------+

大多数省略的字段是tinyint0或1.匹配表中当前有25个字段.

匹配表中有大约2,000,000行,分析约500本书的输出.

目前,该网站有一个"报告"区域,可以matches像这样查询表格:

SELECT COUNT(*)
FROM matches
WHERE is_readable = 1
AND other_flag = 0
AND another_flag = 1
Run Code Online (Sandbox Code Playgroud)

但是,目前获取主索引报告需要一分多钟,因为每个查询大约需要0.7秒.我在查询级别缓存此问题,但初始页面加载仍然需要很长时间.

由于我在如何管理这样的数据集方面不是很有经验,有人可以建议我更好地存储或查询这些数据吗?我是否可以使用MySQL来改善这些COUNTs 的性能,或者我最好使用其他数据库或数据结构?

我们目前正在使用MySQL和MyISAM表以及VPS,因此完全切换到新的数据库系统并非不可能.

fir*_*ire 5

您需要使用索引,WHERE在最常用的列上创建索引.

ALTER TABLE `matches` ADD INDEX ( `is_readable` ) 
Run Code Online (Sandbox Code Playgroud)

等等..

您还可以基于多个列创建索引,如果您在其有用的情况下执行相同类型的查询.phpMyAdmin在底部的表的结构页面上有索引选项.