我有一个很大的域名列表,还有很多单词。我想检查一下我的列表中有多少域名在这些词的末尾。我尝试了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';
任何人都知道查询可能会更快?
感谢。
答案 0 :(得分:0)
您需要在结尾处加倍SUBSTRING_INDEX
和SUBSTRING
才能进行单词匹配
以下内容将计算 example.com 以及 example.de 和 somethingexample.com
SELECT COUNT(*) FROM t1 WHERE SUBSTRING( SUBSTRING_INDEX( SUBSTRING_INDEX(domain_name, '.', -2), '.',1), length('example')*(-1)) = 'example';
此外,您可以使用变量(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
,因为它允许在每次访问磁盘时获取更多有意义的数据