使用PHP从MySQL创建第一个和第二个字符列表的优化
我已经做了很多尝试,以获得一个优化版本,使用数据的第一个字符创建数据列表,然后使用另一个查询来优化它,检索前两个字符,然后从优化中获取整个数据。下面是我当前的两个查询和表的结构。该表有14M+行数据,而且还在增加。出于同样的目的,需要在较大的表上应用类似的方法 获取第一个字符的列表:使用PHP从MySQL创建第一个和第二个字符列表的优化,mysql,Mysql,我已经做了很多尝试,以获得一个优化版本,使用数据的第一个字符创建数据列表,然后使用另一个查询来优化它,检索前两个字符,然后从优化中获取整个数据。下面是我当前的两个查询和表的结构。该表有14M+行数据,而且还在增加。出于同样的目的,需要在较大的表上应用类似的方法 获取第一个字符的列表: SELECT `Letter`, COUNT(`Letter`) AS `Count` FROM (SELECT LEFT(TRIM(`Words`), 1) AS `Letter` FROM `table_myw
SELECT `Letter`, COUNT(`Letter`) AS `Count` FROM (SELECT LEFT(TRIM(`Words`), 1) AS `Letter` FROM `table_mywords`) `a` GROUP BY `Letter` ORDER BY `Letter`
获取前两个字符的列表($first_letter
由PHP作为上述查询中的选定条目提供):
第三个查询是($firsttwo_letters
由PHP从上述查询中选择输入):
我得到的查询时间在第一次查询时超过15秒,在第二次查询时大约25秒
表格结构如下所示:
CREATE TABLE IF NOT EXISTS `table_mywords` (
`id` int(10) unsigned NOT NULL,
`Unique` tinytext COLLATE utf8_persian_ci NOT NULL,
`Words` text COLLATE utf8_persian_ci NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;
ALTER TABLE `scipers_keywords`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `Unique` (`Unique`(128),`Words`(128)),
ADD KEY `Words_3` (`Words`(3)),
ADD FULLTEXT KEY `Words` (`Words`),
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT;
这些已经是我的尝试:
对于第一个查询:
我使用这个查询,然后使用PHP的sort()
对它们进行排序,但总的查询时间仍然差不多
对于第二个查询:
结果不是很准确,也不是很快
SELECT `Letter`, COUNT(`Letter`) AS `Count` FROM (SELECT LEFT(TRIM(`Words`), 2) AS `Letter` FROM `table_mywords` WHERE MATCH(`Words`) AGAINST ('+$first_letter*' IN BOOLEAN MODE) AND UPPER(LEFT(TRIM(`Words`), 1))=UPPER('$first_letter')) `a` GROUP BY `Letter` ORDER BY `Letter`
结果是准确的,但要长得多
此外:
没有做得更好或更糟
非常感谢你的帮助
更新
为了克服这个问题,我暂时改变了一下逻辑。现在,我在一个单独的表格中记录了信件的列表和数量,并定期更新。在本例中,虽然数据库中的列表仍然良好,但我将从新表中检索列表,而不是从原始数据中检索查询。但即使是执行死刑,主要问题仍然存在。仍然需要帮助。这些查询的目的是什么?您正在尝试实现关键字搜索吗?我想为用户创建一种通过列表访问数据的方法。该数据(比如“a”)基本上是其他表数据(比如“b”)的某种特征,用户应该能够通过对表“a”进行全文搜索来访问表“b”数据。我希望这是有用的我有点困惑。您刚才提到了两个表,
a
和b
,但所有查询只涉及一个表,table\u mywords
。我很难从用户的角度理解它是什么样子。假设我是一个用户。我看到了什么?我该怎么办?请使用真实的概念,如“汽车”、“工作”等。。与其说是“a”和“b”,不如说我们有两张表“汽车”和“规格”。我上面提到的所有查询都是针对规范的,这些规范由每个字作为一个数据行组成(table_mywords
)。“规格”表中的多行分配给“cars”表中的每一行。我这个问题的目的是为规范的文字提供一个很好的列表方法。好吧,也许我明白了。作为一个用户,我选择“car”并触发一个http请求。您的脚本将car
作为输入,在specifications
表中查找与car
相关的所有记录并返回它们。因此,您希望查询选择给定特定汽车的所有规格
?
CREATE TABLE IF NOT EXISTS `table_mywords` (
`id` int(10) unsigned NOT NULL,
`Unique` tinytext COLLATE utf8_persian_ci NOT NULL,
`Words` text COLLATE utf8_persian_ci NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;
ALTER TABLE `scipers_keywords`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `Unique` (`Unique`(128),`Words`(128)),
ADD KEY `Words_3` (`Words`(3)),
ADD FULLTEXT KEY `Words` (`Words`),
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT;
SELECT DISTINCT UPPER(LEFT(TRIM(`Words`), 1)) AS `Letter` FROM `table_mywords`
SELECT `Letter`, COUNT(`Letter`) AS `Count` FROM (SELECT LEFT(TRIM(`Words`), 2) AS `Letter` FROM `table_mywords` WHERE MATCH(`Words`) AGAINST ('+$first_letter*' IN BOOLEAN MODE)) `a` GROUP BY `Letter` ORDER BY `Letter`
SELECT `Letter`, COUNT(`Letter`) AS `Count` FROM (SELECT LEFT(TRIM(`Words`), 2) AS `Letter` FROM `table_mywords` WHERE MATCH(`Words`) AGAINST ('+$first_letter*' IN BOOLEAN MODE) AND UPPER(LEFT(TRIM(`Words`), 1))=UPPER('$first_letter')) `a` GROUP BY `Letter` ORDER BY `Letter`
SELECT DISTINCT UPPER(LEFT(TRIM(`Words`), 2)) AS `Letter` FROM `table_mywords` WHERE UPPER(LEFT(TRIM(`Words`), 1))=UPPER('$first_letter')