Страница 1 из 1

оптимизировать запрос

Добавлено: 2008-12-22 23:03:21
Alex Keda
ДОска объявлений. Внизу объявления показываются 5 случайных объяв той же категории

Код: Выделить всё

SELECT *
FROM `messages`
WHERE `sub_cat_id` = '17'
AND `visible` = '1'
ORDER BY RAND( )
LIMIT 5
таблица

Код: Выделить всё

	CREATE TABLE `messages` (
 `id` int(6) NOT NULL auto_increment,
 `visible` int(1) NOT NULL,
 `sub_cat_id` int(3) NOT NULL,
 `add_date` int(15) NOT NULL,
 `ip` varchar(15) NOT NULL,
 `msg_zag` varchar(255) NOT NULL,
 `msg_text` text NOT NULL,
 `city` int(3) NOT NULL,
 `price` varchar(32) NOT NULL,
 `person` varchar(70) NOT NULL,
 `org` varchar(70) NOT NULL,
 `phones` varchar(70) NOT NULL,
 `site` varchar(127) NOT NULL,
 `email` varchar(64) NOT NULL,
 `spamprotect` int(1) NOT NULL,
 `image` varchar(9) NOT NULL,
 PRIMARY KEY  (`id`),
 KEY `visible` (`visible`),
 KEY `sub_cat_id` (`sub_cat_id`),
 KEY `add_date` (`add_date`),
 KEY `city` (`city`)
) ENGINE=MyISAM AUTO_INCREMENT=15699 DEFAULT CHARSET=cp1251 COMMENT='таблица объявлений'
число записей видно. почти все в этой категории (`sub_cat_id`)
запрос выполянется 0.5-0.8 секунды =(
========
идеи есть?

Re: оптимизировать запрос

Добавлено: 2008-12-22 23:55:22
Alex Keda

Код: Выделить всё

SELECT * FROM `messages` WHERE `sub_cat_id`='17' AND `visible`='1' LIMIT 6697, 5
рандомно генерю точку старта (php)
сосбно - всё равно долго - 25-30 тысячных секунды...

Re: оптимизировать запрос

Добавлено: 2008-12-23 4:18:17
ProFTP
записей много?

если очень много строк, то может быть из-за limit

попробуй по столбцу в таблице вместо limit если проблема в этом

Re: оптимизировать запрос

Добавлено: 2008-12-23 6:36:05
jeehadina
RAND всегда тормозит.
по возможности его не трогать...

Re: оптимизировать запрос

Добавлено: 2008-12-23 19:40:37
zg
lissyara писал(а):

Код: Выделить всё

SELECT * FROM `messages` WHERE `sub_cat_id`='17' AND `visible`='1' LIMIT 6697, 5
рандомно генерю точку старта (php)
сосбно - всё равно долго - 25-30 тысячных секунды...
выложи

Код: Выделить всё

EXPLAIN SELECT * FROM `messages` WHERE `sub_cat_id`='17' AND `visible`='1' LIMIT 6697, 5
походу индексы неверно выставлены

Re: оптимизировать запрос

Добавлено: 2008-12-23 22:53:07
Alex Keda

Код: Выделить всё

id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	SIMPLE 	messages 	ref 	visible,sub_cat_id 	sub_cat_id 	4 	const 	15296 	Using where

Re: оптимизировать запрос

Добавлено: 2008-12-23 22:54:40
Alex Keda
а вообще - я ж показал запрос создания таблицы.
все индексы что есть - там.
вобщем - я извернулся чутка.
если до 1000 записей в категории - юзается рандом из mysql , если больше - пять подряд с рандомным сдвигом, на php

Re: оптимизировать запрос

Добавлено: 2008-12-24 8:12:19
zg
lissyara писал(а):а вообще - я ж показал запрос создания таблицы.
у тебя там два индекса, по которым можно делать выборку. Да и эксплайн показывает количество строк, которые он будет обрабатывать при запросе. На данный момент 15 тысяч :smile: так что время вполне нормальное.

Код: Выделить всё

KEY `visible` (`visible`),
KEY `sub_cat_id` (`sub_cat_id`),
если запрос не будешь менять, то эти два индекса надо убить и заменить одним

Код: Выделить всё

KEY `sub_cat_id` (`sub_cat_id`, `visible`)
это даст существенное преемущество при выборке по категории только видимых сообщений. А вообще я бы разделил видимые и невидимые сообщения по разным таблицам, дабы уменшить нагрузку на индексы.

Re: оптимизировать запрос

Добавлено: 2008-12-24 10:45:07
Alex Keda
невидимых - очень мало. < 0.1%

Re: оптимизировать запрос

Добавлено: 2008-12-24 11:52:00
zg
попробуй без учёта видимости

Код: Выделить всё

EXPLAIN SELECT * FROM `messages` WHERE `sub_cat_id`='17' LIMIT 6697, 5
если процент мал, то можно выбирать скажем десять записей и из них через пхп выдавать только пять видимых.

А индекс по видимости тогда можно убрать. Он скорее всего никогда не используется.

Re: оптимизировать запрос

Добавлено: 2008-12-24 12:43:13
Alex Keda
explain.png
explain.png (3.88 КБ) 2016 просмотров

Re: оптимизировать запрос

Добавлено: 2008-12-24 19:57:20
zg
гуд, быстрее уже никак -)))