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列.
全文索引在这里是最好的选择 - 如何实现这取决于你正在使用的DBMS.
除此之外,确保你在列上与模式匹配的索引将有助于提高性能,但是通过它的声音,你已经尝试了这个并且没有太大帮助.
假设您的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子句.