データベースから削除されたドメイン名を選択する動的クエリを作成しています。現時点では 12 行ありますが、すぐに最大 500,000 行のレコードを持つデータを取得する予定です。
スキーマは、4 つの列を含む 1 つのテーブルです。
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」という単語が含まれている
- 少なくとも 1 つの数字を含める
- ドメイン名は 49 文字以上にする必要があります。マルチバイトは 1 文字としてカウントする必要があります (私は 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'
ここに私の質問があります
TLD
列を独自のテーブルにして、TLD
列をその外部キーにするだけで、50 万行になることを考えると、パフォーマンスが大幅に向上しますか? TLD は 5 つだけです (com、net、org、info、biz)。現実世界にはもっと多くの TLD があることはわかっていますが、このアプリケーションには 5 つしかありません。ユーザーは独自の TLD を指定できません。私はそれを知ってい
REGEXP
ます.500,000行はおそらく災害のレシピです. とにかく回避できることはありREGEXP
ますか?私ができるクエリに対する他の最適化はありますか? merge
LIKE
のように、または多分などの他の関数を使用しINSTR
ますか?また、特定の種類のキャッシュ メカニズムを実装する必要がありますか?