我正在构建一个动态查询以从我的数据库中选择删除的域名。目前有十几行,但我很快就会得到数据,其中将有多达 500,000 行的记录。
架构只是一个包含 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
我没有创建架构,这是实时数据库架构。这是示例数据:
我已经构建了可能是下面最复杂的查询类型。标准如下:
选择任意数量的域
- 从“开始”这个词开始
- 以“结束”一词结尾
- 在域名中的任何位置包含单词“containsThis”
- 在域名的任何位置包含单词“ContainsThisToo”
- 至少包含一位数字
- 域名必须至少有 49 个字符。多字节需要算作一个字符(我使用了 CHAR_LENGTH )。
- 域名必须至少少于 65 个字符。
- TLD 必须是“org”
- DropDate 需要晚于
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
列设为自己的表并仅将该列设为该TLD
列的外键,它会极大地提高性能吗?将只有 5 个 TLD(com、net、org、info、biz)。我意识到现实世界中有更多的 TLD,但这个应用程序只有 5 个。用户不能指定自己的 TLD。我知道,
REGEXP
500,000 行可能是灾难的根源。反正我可以避免REGEXP
吗?我可以对查询进行任何其他优化吗?像 merge
LIKE
或使用其他功能,例如可能INSTR
?我应该实现任何特定类型的缓存机制吗?