MYSQL время выполнения запроса - PullRequest
2 голосов
/ 05 сентября 2011

У меня есть к вам вопрос.У меня есть база данных с 250 000 записей, с 2 текстовыми полями, каждое из которых содержит до 300 слов.И я хочу выбрать все данные, которые соответствуют некоторым критериям, и поместить их в другую таблицу.Я подумал удалить те записи, которые не удовлетворяют моему условию, с помощью этого wuery:

DELETE FROM `cables` WHERE 
`data` NOT LIKE "%BRV%" AND
`data` NOT LIKE "%Venezuela%" AND
`data` NOT LIKE "%Caracas%" AND
`data` NOT LIKE "%Hugo Chavez%" AND
`tags` NOT LIKE "%BRV%" AND
`tags` NOT LIKE "%Venezuela%" AND
`tags` NOT LIKE "%Caracas%" AND
`tags` NOT LIKE "%Hugo Chavez%" AND
`header` NOT LIKE "%BRV%" AND
`header` NOT LIKE "%Venezuela%" AND
`header` NOT LIKE "%Caracas%" AND
`header` NOT LIKE "%Hugo Chavez%" AND
`subject` NOT LIKE "%BRV%" AND
`subject` NOT LIKE "%Venezuela%" AND
`subject` NOT LIKE "%Caracas%" AND
`subject` NOT LIKE "%Hugo Chavez%" AND
`tmp` NOT LIKE "%BRV%" AND
`tmp` NOT LIKE "%Venezuela%" AND
`tmp` NOT LIKE "%Caracas%" AND
`tmp` NOT LIKE "%Hugo Chavez%" AND
`identifier` NOT LIKE "%BRV%" AND
`identifier` NOT LIKE "%Venezuela%" AND
`identifier` NOT LIKE "%Caracas%" AND
`identifier` NOT LIKE "%Hugo Chavez%"

Каждая строка в порядке, если она содержит хотя бы одно из этих слов.Дело в том, что у меня уже есть 3 часа с момента его запуска, и ничего не произошло.Я остановил процесс и ничего не произошло.Окончательные результаты должны иметь около 14000 записей. Что я могу сделать?Спасибо !!!!

Ответы [ 4 ]

2 голосов
/ 05 сентября 2011

попробуйте REGEXP, может работать лучше здесь.

DELETE FROM `cables` WHERE
  `data` NOT REGEXP 'BRV|Venezuela|Caracas|Hugo Chavez' AND
  `tags` NOT REGEXP 'BRV|Venezuela|Caracas|Hugo Chavez' AND
  `header` NOT REGEXP 'BRV|Venezuela|Caracas|Hugo Chavez' AND
  `subject` NOT REGEXP 'BRV|Venezuela|Caracas|Hugo Chavez' AND
  `tmp` NOT REGEXP 'BRV|Venezuela|Caracas|Hugo Chavez' AND
  `identifier` NOT REGEXP 'BRV|Venezuela|Caracas|Hugo Chavez'

также попробуйте это с конкатенацией (предложение Каролиса)

DELETE FROM `cables` WHERE
   CONCAT( `data`, `tags`, `header`, `subject`, `tmp`, `identifier` )
   NOT REGEXP 'BRV|Venezuela|Caracas|Hugo Chavez'
2 голосов
/ 05 сентября 2011

Ничего не произошло, потому что ты остановил это. Итак, commit; не было сделано.

Вы должны разбить запрос, чтобы его выполнение было короче.

NOT LIKE %% очень, очень дорого !!! (индекс, если они есть, не используются ...)

1 голос
/ 05 сентября 2011

Проблема в том, что LIKE %text% не будет использовать полнотекстовый индекс.Таким образом, большая таблица с 250 000 записей и множеством LIKE %% критериев займет ужасно много времени.

Вы уверены, что вам нужен ведущий "% ..."?В противном случае вы можете попробовать использовать модификатор логического поиска .

0 голосов
/ 05 сентября 2011

Почему бы не отменить ваше условие, чтобы выбрать записи, которые соответствуют, а не удалять те, которые не соответствуют?А затем вставить их в другой стол?Это вполне может быть быстрее, поскольку 3 часа, даже при чрезмерном использовании непохожих условий, слишком длинны для 250 000 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...