Процедура или цикл

У меня есть стол с именем messages где пользователи моего локального хаба хранят свои сообщения (вроде веб-форумов). В настоящее время в нем участвует большинство пользователей, и я ежедневно получаю от 30 до 50 новых записей.

Так как это продолжалось в течение прошлых нескольких лет, у нас есть почти 100000 строк данных в таблице. Структура таблицы примерно такая. куда fid это PRIMARY а также ip а также id (ник) просто INDEX,

Я использовал этот вид запроса до сих пор; и затем повторять набор результатов в luasql, как показано в этой ссылке. Это, по моему мнению, занимает много времени и места (в буферах).

`msg` VARCHAR(280) NOT NULL,
`id` VARCHAR(30) NOT NULL,
`ctg` VARCHAR(10) NOT NULL,
`date` DATE NOT NULL COMMENT 'date_format( %m/%d/%y )',
`time` TIME NOT NULL COMMENT 'date_format( %H:%i:%s )',
`fid` BIGINT(20) NOT NULL AUTO_INCREMENT,
`ip` CHAR(39) NOT NULL DEFAULT '127.0.0.1'

Моя проблема в том, что сейчас мы перешли на новый API PtokaX, и количество запросов на чтение и запись резко возросло. Поскольку я недавно читал о процедурах MySQL, я думал, являются ли эти процедуры более быстрым или безопасным способом решения этой ситуации.

SELECT *
FROM ( SELECT *
    FROM `messages`
    ORDER BY `fid` DESC
    LIMIT 50 ) AS `temp`
ORDER BY `fid` ASC;

PS

Мы получаем около одного запроса на чтение одного сообщения в среднем каждые 7–10 секунд. По выходным она увеличивается примерно до одного каждые 3 секунды.

Пожалуйста, дайте мне знать, если что-то еще требуется.


ПОДВОДИТЬ ИТОГИ

Это способ, которым я могу вызвать хранимую процедуру и получить конечный результат за меньшее время. Текущий запрос (и метод) занимает почти 3 секунды для извлечения и организации данных.

1 ответ

Решение

Несколько вещей относительно вашего запроса:

SELECT *
FROM ( SELECT *
    FROM `messages`
    ORDER BY `fid` DESC
    LIMIT 50 ) AS `temp`
ORDER BY `fid` ASC;
  1. Никогда SELECT * (все); всегда указывайте список столбцов (что вам нужно)
  2. Подзапросы обычно стоят дороже (для сортировки и хранения)
  3. Если вы пытаетесь получить нижний "50", пытаясь использовать BETWEEN пункт вместо

Вы всегда можете увидеть, что делает ваш запрос, используя EXPLAIN, Я бы попробовал следующий запрос:

SELECT `msg`, `id`, `ctg`, `date`, `time`, `fid`, `ip` FROM `messages` 
WHERE `fid` > (SELECT MAX(`fid`)-50 FROM `messages`)
ORDER BY `fid` 
Другие вопросы по тегам