2014-02-21 4 views
2

У меня есть большой список доменных имен и большой список слов. Я хочу проверить, сколько доменных имен в моем списке имеют каждое из этих слов в конце их. Я попробовал 2 запроса, но оба они занимают слишком много времени для выполнения. Попытка выяснить, есть ли способ сделать запрос быстрее.Поиск более быстрого запроса, чем «% something.%»

Сначала я попробовал этот запрос, он занимает около 50 минут, чтобы вернуть результаты:

SELECT COUNT(*) AS count 
FROM table 
WHERE domain_name LIKE '%my_word.%'; 

Тогда я подумал, что если я удалю .% от него, может быть, он будет идти быстрее, так что я попытался это, но он все еще медленный:

SELECT COUNT(*) AS count 
FROM table 
WHERE SUBSTRING_INDEX(domain_name, '.', 1) LIKE '%my_word'; 

У кого-нибудь есть идея запроса, который может пойти быстрее?

Спасибо.

+0

какой двигатель mysql вы используете ?? –

+0

Я использую двигатель innodb – CodeBird

+0

Можете ли вы предоставить несколько образцов спичек? – Alexander

ответ

0

Вам нужно удвоить SUBSTRING_INDEX и SUBSTRING с конца для словесного совпадения.
Ниже будет засчитываться example.com, а также example.de и somethingexample.com

 
SELECT COUNT(*) 
    FROM t1 
WHERE SUBSTRING(
     SUBSTRING_INDEX(
     SUBSTRING_INDEX(domain_name, '.', -2), 
      '.',1), length('example')*(-1)) = 'example'; 

SQLFiddle

Кроме того, вы можете не вводить модель 2 раза, используя переменные (Fiddle)

 
SET @WORD = 'example'; 
SET @LNGTH = length(@WORD)*(-1); 
SELECT COUNT(*) 
    FROM t1 
WHERE SUBSTRING(
     SUBSTRING_INDEX(
     SUBSTRING_INDEX(domain_name, '.', -2), 
      '.',1), @LNGTH) = @WORD; 
+0

Я не хочу, чтобы субдомены мне нужны домены, codeexample.com должен рассчитывать, если я ищу слово 'example' – CodeBird

+0

и examplecode.com тоже должно совпадать? – Alexander

+0

Да, но найти количество доменов, которые имеют «пример» в начале, например 'examplecode.com', очень быстр, так как требуется несколько секунд, проблема в конце слова – CodeBird

0

Для достижения наилучших результатов, вам нужно создать полнотекстовый индекс на данных, использовать InnoDB MySQL двигатель

например

SELECT * 
FROM domain_name 
WHERE MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE) 

см http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

+0

будет ли это работать без пробелов? И даже если это произойдет, тогда он вернет мне результаты, где слово находится в середине домена, например, если я ищу 'пример', он получит меня' codeexampletest.com', в результате чего я не хочу. Спасибо за попытку – CodeBird

+0

@CodeBird конечно –

+0

# 1214 - Используемый тип таблицы не поддерживает индексы FULLTEXT :( – CodeBird

0

Ваша проблема может быть решена с помощью полнотекстового индекса, но он совместим только в версии 5.6 для innodb, и вы можете использовать в любой версии таблицы myisam.

Создать полный текст Индекса по ниже command-

ALTER TABLE my_table ADD FULLTEXT(domain_name); 

Теперь вы можете использовать запрос согласно

цен ниже
SELECT count(*) FROM my_table WHERE MATCH (domain_name) AGAINST ('your_word'); 
0

Поскольку ваш запрос не ищет отдельные слова, я считаю, что это будет» t извлекает выгоду из полного текстового индекса (движок не знает, как разобрать домен на отдельные слова). Я также не считаю, что решения substring обеспечат лучшую производительность, чем оператор LIKE. Вы имеете дело с простым сопоставлением строк, а базы данных - не лучшее место для его запуска.

Сказанное, я считаю, что лучшее, что вы можете сделать, чтобы улучшить скорость этого запроса, - уменьшить количество байтов, которые нужно читать с диска. Вы можете добиться этого, создав простой индекс в этом столбце (запрос будет по-прежнему индексировать, но он будет дешевле, чем сканирование таблицы).Еще одна вещь, которую вы можете сделать, - удалить ненужные символы из этого столбца, например .com или .net, так как это позволит больше значащих данных для каждого доступа к диску.

+0

спасибо за предложение, но я не могу удалить .com и .net и т. д. ... база данных для запущенного веб-сайта, который на самом деле является сайтом whois, whoisology.com, поэтому не может действительно удалить info – CodeBird

+0

Привет, @CodeBird, извините, я не был ясен, я не хотел удалять '.com' или' .net' из существующего столбца, но для создания нового столбца, оптимизированного для этой цели , без байтов, которые не имеют значения. –

Смежные вопросы