我有数百万个域名的SQL表。但现在当我搜索让我们说
时SELECT *
FROM tblDomainResults
WHERE domainName LIKE '%lifeis%'
获得结果需要10分钟以上。我试过索引,但没有帮助。
在短时间内存储这数百万条记录并轻松访问这些信息的最佳方法是什么?
到目前为止,大约有5000万条记录和5列。
答案 0 :(得分:12)
最有可能的是,您尝试使用传统索引来优化LIKE查询,除非模式以固定字符串开头(例如'lifeis%')。
您的查询所需的是全文索引。大多数DBMS最近都支持它。
答案 1 :(得分:6)
全文索引是这里最好的选择 - 如何实现这取决于你正在使用的DBMS。
如果没有这一点,确保你的列上的索引与模式匹配将帮助提高性能,但是听到它的声音,你已经尝试了这个并且它没有帮助很多。
答案 2 :(得分:5)
停止使用LIKE语句。您可以使用fulltext search,但它需要MyISAM表,并不是那么好的解决方案。
答案 3 :(得分:5)
假设您的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);
加载新数据时,请检查是否有新域名 - 并将其插入域名表中。然后在您的大表中,您只需包含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%';
当然除了最小的表之外,它总是有助于避免使用带有通配符的LIKE子句。
答案 4 :(得分:3)
您可能想要考虑的一件事是为此类查找提供单独的搜索引擎。例如,您可以使用SOLR(lucene)服务器搜索并检索与您的搜索匹配的条目ID,然后通过id从数据库中检索数据。即使不得不拨打两个不同的电话,它很可能会更快。
答案 5 :(得分:0)
只要索引本身不包含查找(“书签查找”)数据,索引就会变慢。例如,如果您的索引有2列,ID和NAME,但是您选择*(总共5列)数据库必须读取前两列的索引,然后查找其他3列的索引。其他地方的数据结构效率较低。
在这种情况下,由于“喜欢”,您的索引无法使用。这类似于不在查询上放置任何过滤器,它将完全跳过索引,因为它必须读取整个表,无论如何它只会这样做(“表扫描”)。有一个阈值(我认为发动机通常翻转到35-50%左右)。
简而言之,您似乎不太可能需要数据库中的所有5000万行用于生产应用程序,但如果您这样做...使用具有更多内存的计算机并尝试将这些数据保存在内存中的方法。也许No-SQL DB是更好的选择 - mongoDB,沙发DB,东京内阁。这样的事情。祝你好运!
答案 6 :(得分:0)
您可以尝试将域拆分为块,然后自己搜索块。几年前,当我需要在句子中搜索单词时,我做了一些事情。我没有全文搜索,所以我将句子分成单词列表并搜索单词。由于单词已编入索引,因此查找结果的速度非常快。