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,因此完全切换到新的数据库系统并非不可能.
您需要使用索引,WHERE在最常用的列上创建索引.
ALTER TABLE `matches` ADD INDEX ( `is_readable` )
Run Code Online (Sandbox Code Playgroud)
等等..
您还可以基于多个列创建索引,如果您在其有用的情况下执行相同类型的查询.phpMyAdmin在底部的表的结构页面上有索引选项.