Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从MySQL创建第一个和第二个字符列表的优化_Mysql - Fatal编程技术网

使用PHP从MySQL创建第一个和第二个字符列表的优化

使用PHP从MySQL创建第一个和第二个字符列表的优化,mysql,Mysql,我已经做了很多尝试,以获得一个优化版本,使用数据的第一个字符创建数据列表,然后使用另一个查询来优化它,检索前两个字符,然后从优化中获取整个数据。下面是我当前的两个查询和表的结构。该表有14M+行数据,而且还在增加。出于同样的目的,需要在较大的表上应用类似的方法 获取第一个字符的列表: SELECT `Letter`, COUNT(`Letter`) AS `Count` FROM (SELECT LEFT(TRIM(`Words`), 1) AS `Letter` FROM `table_myw

我已经做了很多尝试,以获得一个优化版本,使用数据的第一个字符创建数据列表,然后使用另一个查询来优化它,检索前两个字符,然后从优化中获取整个数据。下面是我当前的两个查询和表的结构。该表有14M+行数据,而且还在增加。出于同样的目的,需要在较大的表上应用类似的方法

获取第一个字符的列表:

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')