我正在构建一个动态查询,以从我的数据库中选择删除的域名。目前有十几行,但我很快就会得到数据,它将有多达50万行的记录。
模式只是一个包含4列的表:
CREATE TABLE `DroppedDomains` (
`domainID` int(11) NOT NULL AUTO_INCREMENT,
`DomainName` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`DropDate` date DEFAULT NULL,
`TLD` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`domainID`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci我没有创建模式,这是动态数据库模式。以下是样本数据:

我在下面构建了最复杂的查询类型。标准如下:
选择任意数量的域
H 113中的'ContainsThisToo’一词,包括至少一个数字H 214H 115,域名必须至少为49个字符。多字节需要计算为一个字符(我使用了CHAR_LENGTH )。
2009-11-01
晚一点
到目前为止,我的查询如下:
SELECT
*
FROM
DroppedDomains
WHERE
1=1
AND DomainName LIKE 'starts%ends'
AND DomainName LIKE '%containsThis%'
AND DomainName LIKE '%containsThisToo%'
AND DomainName LIKE '%-%'
AND DomainName REGEXP '[0-9]'
AND CHAR_LENGTH(DomainName) > 49
AND CHAR_LENGTH(DomainName) < 65
AND TLD = 'org'
AND DropDate > '2009-11-01'这是我的问题
考虑到我将有50万行,如果我将列作为自己的表,并将TLD列作为该表的外键,那么
REGEXP和50万行可能会导致灾难。无论如何,我可以避免REGEXP吗?LIKE或者使用其他函数,比如INSTR?我应该实现任何特定的缓存机制吗?发布于 2011-03-12 21:42:01
当您有一个以常量前缀开头的相似模式,并且在该字段上有一个索引时,则可以使用该索引很快地找到以前缀开头的行。幸运的是,这里确实存在这样的情况:
AND DomainName LIKE 'starts%ends'如果只有少数值以starts开头,那么将很快找到这些行,而其他表达式只会测试这些行。您可以通过运行EXPLAIN SELECT ...来检查索引是否被使用。
发布于 2011-03-13 02:40:40
应根据计划使用的查询规划要创建的索引。
上的2列索引。
如果您将使用的唯一查询是您提到的复杂查询,那么Mark的建议(关于DomainName上的索引)是最好的。
关于TLD字段的问题1:
如果您真的只有少量的选项(比如5),并且您不打算使用所有可用的tlds,那么您可以使用ENUM type。
CREATE TABLE(
....
tld ENUM('com', 'net', 'org', 'info', 'biz')
)https://stackoverflow.com/questions/5285637
复制相似问题