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

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-12-22 23:03:21

ДОска объявлений. Внизу объявления показываются 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 секунды =(
========
идеи есть?
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-12-22 23:55:22

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

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

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2008-12-23 4:18:17

записей много?

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

попробуй по столбцу в таблице вместо limit если проблема в этом
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

jeehadina
мл. сержант
Сообщения: 93
Зарегистрирован: 2008-04-07 8:59:20

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

Непрочитанное сообщение jeehadina » 2008-12-23 6:36:05

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-12-23 19:40:37

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
походу индексы неверно выставлены

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-12-23 22:53:07

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

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
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-12-23 22:54:40

а вообще - я ж показал запрос создания таблицы.
все индексы что есть - там.
вобщем - я извернулся чутка.
если до 1000 записей в категории - юзается рандом из mysql , если больше - пять подряд с рандомным сдвигом, на php
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-12-24 8:12:19

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

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

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

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

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-12-24 10:45:07

невидимых - очень мало. < 0.1%
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-12-24 11:52:00

попробуй без учёта видимости

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

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

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-12-24 12:43:13

explain.png
explain.png (3.88 КБ) 1153 просмотра
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-12-24 19:57:20

гуд, быстрее уже никак -)))