СОЗДАТЬ ВИД для MYSQL за последние 30 дней - PullRequest
1 голос
/ 04 июня 2010

Я знаю, что я пишу запрос неправильно, и когда мы получаем большой трафик, наша база данных получает удар HARD, и страница замедляется до нуля ... Я думаю, что мне нужно написать запросы на основе CREATE VIEW за последние 30 дней с CURDATE ?? Но не знаете, с чего начать или это будет более эффективный запрос для базы данных?

В любом случае, вот пример запроса, который я написал ..

$query_Recordset6 = "SELECT `date`, title, category, url, comments 
                       FROM cute_news 
                      WHERE category LIKE '%45%' 
                   ORDER BY `date` DESC";

Любая помощь или предложения будут великолепны! У меня есть около 11 таких запросов, но я уверен, что если бы мне удалось получить помощь по одному из них, я смогу реализовать их для остальных !!

Ответы [ 7 ]

2 голосов
/ 04 июня 2010

Помещение подстановочного знака слева от сравнения значений:

LIKE '%xyz'

... означает, что индекс нельзя использовать, даже если он существует. Возможно, стоит рассмотреть возможность использования Полнотекстового поиска (FTS), что означает добавление полнотекстовой индексации .

Нормализация данных будет еще одним шагом к рассмотрению - категории, вероятно, должны быть в отдельной таблице.

0 голосов
/ 04 июня 2010

Любой ответ - предположение, покажите:
- соответствующие SHOW CREATE TABLE выходы
- ОБЪЯСНИТЕ вывод ваших общих запросов.

И комментарий Билла Карвина, безусловно, применим.

После всего этого и оптимизации, выборка данных в таблицу только за последние 30 дней все еще может быть желательна, и в этом случае вам лучше использовать ежедневный cronjob для этого.

0 голосов
/ 04 июня 2010

Я предполагаю, что ваш столбец category представляет собой список значений категории, например "12,34,45,78"?

Это не хороший дизайн реляционных баз данных. Одна из причин, по которой это не очень хорошо, как вы обнаружили: поиск подстроки, которая может появиться в середине этого списка, невероятно медленен.

Некоторые люди предлагают использовать полнотекстовый поиск вместо предиката LIKE с подстановочными знаками, но в этом случае проще создать другую таблицу, чтобы вы могли перечислить одно значение категории в строке со ссылкой на вашу таблицу cute_news :

CREATE TABLE cute_news_category (
  news_id INT NOT NULL,
  category INT NOT NULL,
  PRIMARY KEY (news_id, category),
  FOREIGN KEY (news_id) REFERENCES cute_news(news_id)
) ENGINE=InnoDB;

Тогда вы можете сделать запрос, и он будет работать намного быстрее:

SELECT n.`date`, n.title, c.category, n.url, n.comments 
FROM cute_news n
JOIN cute_news_category c ON (n.news_id = c.news_id)
WHERE c.category = 45 
ORDER BY n.`date` DESC
0 голосов
/ 04 июня 2010

Если ваша база данных сильно пострадала, решение состоит не в том, чтобы создать представление (представление по-прежнему в основном выполняет ту же работу, что и база данных), а в решении - кэшировать результаты.

Это особенно применимо, поскольку, как это ни звучит, ваши данные нужно обновлять только раз в 30 дней.

0 голосов
/ 04 июня 2010

Все с LIKE "% XXX%" будет медленным.Это медленная операция.

Для чего-то вроде категорий вы можете разделить категории на другие таблицы и использовать внешний ключ в таблице cute_news.Таким образом, вы можете иметь category_id и использовать его в запросе, который будет НАМНОГО быстрее.


Кроме того, я не совсем уверен, почему вы говорите об использовании CREATE VIEW.Представления не очень помогут вам в скорости.Нет, если это не материализованное представление, которое MySQL не предполагает изначально.

0 голосов
/ 04 июня 2010

ОК, время для экстрасенсорной отладки.

На мой взгляд, я вижу, что производительность запросов значительно улучшится за счет нормализации базы данных, в частности, путем разделения многозначного столбца категории в отдельную таблицу с двумя столбцами: первичный ключ для cute_news и идентификатор категории .

Это также позволит вам напрямую связать указанную таблицу с таблицей категорий без необходимости ее предварительного анализа.

Или, как сказал Крис Дэйт: «Каждое пересечение строк и столбцов содержит ровно одно значение из соответствующего домена (и ничего больше)».

0 голосов
/ 04 июня 2010
SELECT `date`, title, category, url, comments 
                       FROM cute_news 
                      WHERE category LIKE '%45%' 
                   ORDER BY `date` DESC

LIKE '%45%' означает, что необходимо выполнить полное сканирование таблицы. Возможно, вы храните список категорий в столбце? В этом случае создание новой категории хранения таблицы и news_article_id позволит использовать индекс для гораздо более эффективного извлечения соответствующих записей.

...