Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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
如何加速复杂的MYSQL查询?_Mysql_Sql_Coldfusion - Fatal编程技术网

如何加速复杂的MYSQL查询?

如何加速复杂的MYSQL查询?,mysql,sql,coldfusion,Mysql,Sql,Coldfusion,我在ColdFusion网站调用的ColdFusion组件中有以下MYSQL查询。我有一个自定义选项,它基本上为以下字段构建布尔查询:“PlaceName、Country、Adm1、adm2、adm3、locality” 我知道这是丑陋和复杂的。运行大约需要1836毫秒。有没有更好的方法来编写查询或代码,以便在不到一秒钟的时间内加速返回的数据 以下是有关SQL的说明: 问题在于引擎正在对表格进行完整的表格扫描,然后根据对分组的结果进行排序 由于像s这样的s,几乎需要进行全表扫描: (((Plac

我在ColdFusion网站调用的ColdFusion组件中有以下MYSQL查询。我有一个自定义选项,它基本上为以下字段构建布尔查询:“PlaceName、Country、Adm1、adm2、adm3、locality”

我知道这是丑陋和复杂的。运行大约需要1836毫秒。有没有更好的方法来编写查询或代码,以便在不到一秒钟的时间内加速返回的数据

以下是有关SQL的说明:

问题在于引擎正在对表格进行完整的表格扫描,然后根据对
分组的结果进行排序

由于像
s这样的s,几乎需要进行全表扫描:

(((PlaceName LIKE '%chappaqua%') OR (Country LIKE '%chappaqua%') OR (Adm1 LIKE '%chappaqua%') OR (adm2 LIKE '%chappaqua%') OR (adm3 LIKE '%chappaqua%') OR (locality  LIKE '%chappaqua%')))
问题是无法使用PlaceName上的索引,因为初始字符不是固定的

所以。您可以通过删除
组吗?您至少可以将其替换为
distinct
,尽管我认为这不会影响查询计划。您是否有关于
place\u cats(placeId,catId)
的索引?这至少会阻止查询读取category表,以便只进行索引查找

您能否将搜索范围限制为字段开头的单词


我能想到的另一种选择是在MySQL中切换到使用全文索引。

问题是引擎正在对表进行全表扫描,然后对
分组的结果进行排序

由于像
s这样的
s,几乎需要进行全表扫描:

(((PlaceName LIKE '%chappaqua%') OR (Country LIKE '%chappaqua%') OR (Adm1 LIKE '%chappaqua%') OR (adm2 LIKE '%chappaqua%') OR (adm3 LIKE '%chappaqua%') OR (locality  LIKE '%chappaqua%')))
问题是无法使用PlaceName上的索引,因为初始字符不是固定的

所以。您可以通过删除
组吗?您至少可以将其替换为
distinct
,尽管我认为这不会影响查询计划。您是否有关于
place\u cats(placeId,catId)
的索引?这至少会阻止查询读取category表,以便只进行索引查找

您能否将搜索范围限制为字段开头的单词



我能想到的另一个选择是在MySQL中切换到使用全文索引。

显示您的索引。向我们展示您的
EXPLAIN
。您似乎没有使用聚合功能,那么GROUP BY怎么了?@草莓他们正在尝试获得
不同的
行,建议他们使用该功能@这就是为什么
groupby
对MySQLShow显示索引感到沮丧的原因。向我们展示您的
EXPLAIN
。您似乎没有使用聚合功能,那么GROUP BY怎么了?@草莓他们正在尝试获得
不同的
行,建议他们使用该功能@这就是为什么<代码>群组作者<代码>对MySQLOK感到沮丧的原因。。。去掉单词开头的通配符确实可以节省半秒钟的时间,但我不想这样做。是的,我确实有一个place_cats(placeId,catId)索引。是的,用全文搜索代替所有类似的东西难道不值得一看吗?@user1224994。一个选项是全文搜索()。如果您有一个只包含名称的表,然后将其连接到后面,则在您的情况下可能会起作用。较小的表会扫描得更快,在一个不太有选择性的查询上,联接的开销也会很小。。。去掉单词开头的通配符确实可以节省半秒钟的时间,但我不想这样做。是的,我确实有一个place_cats(placeId,catId)索引。是的,用全文搜索代替所有类似的东西难道不值得一看吗?@user1224994。一个选项是全文搜索()。如果您有一个只包含名称的表,然后将其连接到后面,则在您的情况下可能会起作用。较小的表会扫描得更快,并且在不太有选择性的查询上,联接的开销会很小。
(((PlaceName LIKE '%chappaqua%') OR (Country LIKE '%chappaqua%') OR (Adm1 LIKE '%chappaqua%') OR (adm2 LIKE '%chappaqua%') OR (adm3 LIKE '%chappaqua%') OR (locality  LIKE '%chappaqua%')))