如何更快地在SQL表中搜索数百万条记录?

use*_*063 13 sql query-optimization sql-like

我有几百万个域名的SQL表.但现在当我搜索让我们说

SELECT * 
  FROM tblDomainResults 
 WHERE domainName LIKE '%lifeis%'
Run Code Online (Sandbox Code Playgroud)

获得结果需要10分钟以上.我试过索引,但没有帮助.

存储这数百万条记录并在短时间内轻松访问这些信息的最佳方法是什么?

到目前为止,大约有5000万条记录和5列.

Igo*_*nko 12

最有可能的是,您尝试使用传统索引来优化LIKE查询,除非模式以固定字符串开头(例如'lifeis%').

您的查询所需的是全文索引.如今大多数DBMS都支持它.


Wil*_*l A 6

全文索引在这里是最好的选择 - 如何实现这取决于你正在使用的DBMS.

除此之外,确保你在列上与模式匹配的索引有助于提高性能,但是通过它的声音,你已经尝试了这个并且没有太大帮助.


Aar*_*and 6

假设您的5000万行表包含重复项(可能是问题的一部分),并假设SQL Server(语法可能会更改,但概念在大多数RDBMS上类似),另一种选择是将域存储在查找表中,例如

CREATE TABLE dbo.Domains
(
    DomainID INT IDENTITY(1,1) PRIMARY KEY,
    DomainName VARCHAR(255) NOT NULL
);
CREATE UNIQUE INDEX dn ON dbo.Domains(DomainName);
Run Code Online (Sandbox Code Playgroud)

加载新数据时,请检查是否有任何新域名 - 并将其插入域名表中.然后在您的大表中,您只需包含DomainID.这不仅可以使您的5000万行表更小,而且还可以使这样的查找更加高效.

SELECT * -- please specify column names
FROM dbo.tblDomainResults AS dr
INNER JOIN dbo.Domains AS d
ON dr.DomainID = d.DomainID
WHERE d.DomainName LIKE '%lifeis%';
Run Code Online (Sandbox Code Playgroud)

当然除了最小的表之外,它总是有助于避免使用带有前导通配符的LIKE子句.


ter*_*ško 5

停止使用LIKE语句.您可以使用全文搜索,但它将需要MyISAM表,并不是那么好的解决方案.

我建议您检查可用的第三方解决方案 - 如LuceneSphinx.
他们会更优越.