Процедура или цикл
У меня есть стол с именем 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;
- Никогда
SELECT *
(все); всегда указывайте список столбцов (что вам нужно) - Подзапросы обычно стоят дороже (для сортировки и хранения)
- Если вы пытаетесь получить нижний "50", пытаясь использовать
BETWEEN
пункт вместо
Вы всегда можете увидеть, что делает ваш запрос, используя EXPLAIN
, Я бы попробовал следующий запрос:
SELECT `msg`, `id`, `ctg`, `date`, `time`, `fid`, `ip` FROM `messages`
WHERE `fid` > (SELECT MAX(`fid`)-50 FROM `messages`)
ORDER BY `fid`