搜索比'%something。%'更快的查询

时间:2014-02-21 09:11:44

标签: mysql sql

我有一个很大的域名列表,还有很多单词。我想检查一下我的列表中有多少域名在这些词的末尾。我尝试了2个查询但两个都花了太多时间来执行。试图找出是否有任何方法可以使查询更快。

首先我尝试了这个查询,大约需要50分钟才能返回结果:

SELECT COUNT(*) AS count 
FROM   table 
WHERE  domain_name LIKE '%my_word.%'; 

然后我想如果我从中删除.%,也许它会更快,所以我尝试了,但它仍然很慢:

SELECT COUNT(*) AS count 
FROM   table 
WHERE  SUBSTRING_INDEX(domain_name, '.', 1) LIKE '%my_word'; 

任何人都知道查询可能会更快?

感谢。

4 个答案:

答案 0 :(得分:0)

您需要在结尾处加倍SUBSTRING_INDEXSUBSTRING才能进行单词匹配 以下内容将计算 example.com 以及 example.de somethingexample.com

SELECT COUNT(*)
  FROM t1
 WHERE SUBSTRING(
        SUBSTRING_INDEX(
         SUBSTRING_INDEX(domain_name, '.', -2),
          '.',1), length('example')*(-1)) = 'example';

SQLFiddle

此外,您可以使用变量(Fiddle)避免键入模式2次:

SET @WORD = 'example';
SET @LNGTH = length(@WORD)*(-1);
SELECT COUNT(*)
  FROM t1
 WHERE SUBSTRING(
        SUBSTRING_INDEX(
         SUBSTRING_INDEX(domain_name, '.', -2),
          '.',1), @LNGTH) = @WORD;

答案 1 :(得分:0)

为获得最佳效果,您需要为数据创建FULLTEXT索引,使用innoDb mysql引擎

例如

SELECT  *
FROM    domain_name
WHERE   MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE)

参考http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

答案 2 :(得分:0)

您的问题可以通过全文索引解决,但它仅在版本5.6中与innodb兼容,您可以在myisam表的任何版本中使用。

通过以下命令创建全文索引 -

ALTER TABLE my_table ADD FULLTEXT(domain_name);

现在您可以按照以下方式使用查询 -

SELECT count(*) FROM my_table WHERE MATCH (domain_name) AGAINST ('your_word');

答案 3 :(得分:0)

由于您的查询不是在寻找单独的单词,我相信它不会从全文索引中受益(引擎不知道如何将域解析为单个单词)。我也不相信substring解决方案会比LIKE运算符产生更好的性能。您正在处理简单的字符串匹配,并且数据库不是运行它的最佳位置。

也就是说,我相信,为提高此查询的速度,您可以做的最好的事情是减少需要从磁盘读取的字节数。您可以通过在此列上创建一个简单的索引来实现它(查询仍将是索引扫描,但它将比表扫描更便宜)。您可以做的另一件事是从此列中删除不必要的字符,例如.com.net,因为它允许在每次访问磁盘时获取更多有意义的数据