Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 正在搜索比“%something.%”更快的查询_Mysql_Sql - Fatal编程技术网

Mysql 正在搜索比“%something.%”更快的查询

Mysql 正在搜索比“%something.%”更快的查询,mysql,sql,Mysql,Sql,我有一大串域名和一大串单词。我想检查一下我的列表中有多少域名的末尾都有这些单词。我尝试了两个查询,但两个查询的执行时间都太长。试图找出是否有任何方法可以加快查询速度 首先,我尝试了这个查询,返回结果大约需要50分钟: SELECT COUNT(*) AS count FROM table WHERE domain_name LIKE '%my_word.%'; 然后我想,如果我从中删除%s,可能速度会更快,所以我尝试了这个,但仍然很慢: SELECT COUNT(*) AS cou

我有一大串域名和一大串单词。我想检查一下我的列表中有多少域名的末尾都有这些单词。我尝试了两个查询,但两个查询的执行时间都太长。试图找出是否有任何方法可以加快查询速度

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

SELECT COUNT(*) AS count 
FROM   table 
WHERE  domain_name LIKE '%my_word.%'; 
然后我想,如果我从中删除%s,可能速度会更快,所以我尝试了这个,但仍然很慢:

SELECT COUNT(*) AS count 
FROM   table 
WHERE  SUBSTRING_INDEX(domain_name, '.', 1) LIKE '%my_word'; 
有人想到了一个可能更快的查询吗

谢谢。

您需要双子字符串\u索引和结尾处的子字符串来匹配单词。 下面将计算example.com、example.de和somethingeexample.com

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


为了获得最佳结果,您需要在数据上创建全文索引,请使用innoDb mysql引擎

乙二醇


请参阅

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

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

ALTER TABLE my_table ADD FULLTEXT(domain_name);
现在您可以按照下面的说明使用查询-

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

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


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

您使用的是什么mysql表引擎??我使用的是innodb engine您可以提供一些示例匹配吗?示例匹配是什么意思?例如,单词best出现在383956个域名的开头或结尾。这就是我正在搜索的查询,查找单词是否位于域的开头非常快,但是查找单词是否位于域的结尾非常慢,即使我现在也有同样的问题。。!!!我不想要子域我想要域,codeexample.com如果我在搜索单词exampleyes,应该算数,但是要找到在Begging上有示例的域的数量,比如examplecode.com非常快,需要几秒钟,问题是单词的结尾。这肯定行不通。你仍然缺少一个,在“.”和1之间。感谢您的帮助。尝试一下,您将知道在50的位置有27分钟的时间:从表中选择COUNT*,其中RIGHTSUBSTRING_INDEXdomain_name',1,length'men'='men';这在没有空间的情况下可以工作吗?即使是这样,它也会让我回到这个单词中间的结果,就像我搜索的例子一样,它会给我带来CoeExpLeTest.com作为结果,我不想这样做。感谢您尝试1214-所使用的表类型不支持全文索引:innoDb mysql引擎支持,但您使用的是is myIsamthanks以获得建议,但我无法删除.com和.net等。。。该数据库是为一个正在运行的网站,实际上是一个whois网站whoisology.com,所以不能真正删除infoHi,@CodeBird,对不起,我不清楚,我不是要从现有列中删除.com或.net,而是要创建一个新列,为这个目的进行优化,没有不重要的字节。
SELECT  *
FROM    domain_name
WHERE   MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE)
ALTER TABLE my_table ADD FULLTEXT(domain_name);
SELECT count(*) FROM my_table WHERE MATCH (domain_name) AGAINST ('your_word');