Я создаю динамический запрос для выбора удаленных доменных имен из моей базы данных.На данный момент есть десяток строк, но я собираюсь вскоре получить данные, в которых будет записано до 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
Я не создал схему, это схема действующей базы данных.Вот примеры данных:
![enter image description here](https://i.stack.imgur.com/omWao.png)
Я построил, вероятно, самый сложный тип запроса ниже.Критерии таковы:
ВЫБЕРИТЕ любое количество доменов, которые
- начинаются со слова «начинается»
- заканчиваются словом «заканчивается»
- Содержит слово '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'
Вот мои вопросы
Будет ли это чрезвычайно полезным для производительности, учитывая, что у меня будет полмиллиона строк, если я сделаю столбец TLD
своей собственной таблицей ипросто сделать столбец TLD
внешним ключом к этому?Всего будет 5 ДВУ (com, net, org, info, biz).Я понимаю, что в реальном мире есть больше ДВУ, но у этого приложения будет только 5. Пользователь не может указать свой собственный ДВУ.
Я знаю, что REGEXP
и 500 000 строк, вероятно,рецепт катастрофы.Могу ли я в любом случае избежать REGEXP
?
Есть ли какие-либо другие оптимизации для запроса, который я могу сделать?Например, объединить LIKE
с или использовать другие функции, например INSTR
?И должен ли я реализовать какой-то конкретный механизм кэширования?