Пара вопросов спецам по мускулу

D
На сайте с 05.06.2007
Offline
155
#31
netwind:
это сейчас или раньше?
приведите полные тексты запросов и explain к каждому. и лучше без этой гадости phpшной - глаза сломать можно.

через пхп, но красивее )

explain select f.*,n.date as notedate,n.user as noteuser from `tb_notes` n left join `tb_fotos` f on f.id=n.foto where n.note=10 having f.ok=1 and f.view=0 and f.ero=0 order by n.id desc limit 0,20

(
[id] => 1
[select_type] => SIMPLE
[table] => n
[type] => ALL
[possible_keys] =>
[key] =>
[key_len] =>
[ref] =>
[rows] => 85666
[Extra] => Using where; Using filesort
)

(
[id] => 1
[select_type] => SIMPLE
[table] => f
[type] => eq_ref
[possible_keys] => PRIMARY
[key] => PRIMARY
[key_len] => 4
[ref] => usr_web1_1.n.foto
[rows] => 1
[Extra] =>
)
runtime < 0.1

меняю having на and


explain select f.*,n.date as notedate,n.user as noteuser from `tb_notes` n left join `tb_fotos` f on f.id=n.foto where n.note=10 and f.ok=1 and f.view=0 and f.ero=0 order by n.id desc limit 0,20

(
[id] => 1
[select_type] => SIMPLE
[table] => f
[type] => ALL
[possible_keys] => PRIMARY
[key] =>
[key_len] =>
[ref] =>
[rows] => 12648
[Extra] => Using where; Using temporary; Using filesort
)

(
[id] => 1
[select_type] => SIMPLE
[table] => n
[type] => ref
[possible_keys] => foto
[key] => foto
[key_len] => 4
[ref] => usr_web1_1.f.id
[rows] => 2
[Extra] => Using where
)

runtime > 0.7

Варианты с лимитом без старта и условию по стартовому ID, для обоих запросов выгоды в скорости не приносит )

Написал не мало шедевров ;)
RAS
На сайте с 27.11.2005
Offline
126
RAS
#32

дали бы explain не через php, нагляднее было бы. У вас там filesort из-за order by, надо индексы смотреть, структуры таблиц (show create table ...) - тогда можно и вывод сделать.

Администрируем сервера, впс, вдс. Ускоряем загрузку сайтов - DLE, Word Press, Joomla, Modx... Настраиваем безопасность. Ручная чистка rootkit/malware/вирусов. (/ru/forum/867860) Разработка - shell/bash/sh/python/perl.
N
На сайте с 06.05.2007
Offline
419
#33

Dimanych, а если еще и left убирать? думаю, просто много данных в f и остается только тройной индекс создать

Кнопка вызова админа ()
D
На сайте с 05.06.2007
Offline
155
#34

RAS,

я описывал структуру чуть ранее, индексы только на (id,foto - таблица n) и на (id,user - таблица f), другие индексы нехочу прописывать так как это становится не целесообразно.

Это единственный такой замороченный запрос, другие в основном по индексам и с одной таблицей..

netwind,

Как это left убрать. Ну убрал я его и получилось что и с having и без него теперь более 0.7сек..

Изменилась эта строчка для таблицы n: [Extra] => Using temporary; Using filesort (пропал where)

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

Всё таки оптимизация запросов не лёгкая задача ;)

N
На сайте с 06.05.2007
Offline
419
#35

Dimanych, честно говоря, не понимаю почему с HAVING это быстрее работает. Having без группировки в других субд вообще получается синтаксически неправильным.

может просто погрешности кеширования? вы в курсе про SQL_NO_CACHE ?

А если показать show create table будет просто удобнее воссоздать у себя и потестировать.

D
На сайте с 05.06.2007
Offline
155
#36

Нет, не погрешность кеширования, не 1 раз проверял..

Хотите попробовать, вот таблички, но их нужно забить чем то:

CREATE TABLE IF NOT EXISTS `tb_fotos` (
`id` int(10) NOT NULL auto_increment,
`user` int(10) NOT NULL default '0',
`album` int(10) NOT NULL default '0',
`date` int(10) NOT NULL default '0',
`changed` int(10) NOT NULL default '0',
`comment` varchar(100) NOT NULL default '',
`comments` int(10) NOT NULL default '0',
`notec` int(10) NOT NULL default '0',
`noted` int(10) NOT NULL default '0',
`ero` tinyint(1) NOT NULL default '0',
`view` tinyint(1) NOT NULL default '0',
`ok` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `user` (`user`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=17884 ;



CREATE TABLE IF NOT EXISTS `tb_notes` (
`id` int(10) NOT NULL auto_increment,
`user` int(10) NOT NULL default '0',
`touser` int(10) NOT NULL default '0',
`foto` int(10) NOT NULL default '0',
`date` int(10) NOT NULL default '0',
`note` tinyint(4) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `foto` (`foto`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=105648 ;

Сколько они занимают у меня

tb_notes 85,712 записей MyISAM cp1251_general_ci 3.9 МБ

tb_fotos 12,654 записей MyISAM cp1251_general_ci 1.0 МБ

в тот раз что то я напутал на счёт того что 20к оценок, оказывается 85к )

SJ
На сайте с 16.03.2008
Offline
78
#37
ciber:
фултекстсерч у муксула самый сильный?

Вот насчет фултекстсерча - нет.

А все остальное у него на ура. Заменять MySQL на Oracle или MSSQL (при условии того, что оптимизация на любой СУБД проводится максимальная) смысла нет.

sokol_jack добавил 10.12.2008 в 21:23

select f.*,n.date as notedate,n.user as noteuser from `tb_notes` n left join `tb_fotos` f on (f.id=n.foto and n.note=10 and f.ok=1 and f.view=0 and f.ero=0) order by n.id desc limit 0,20

Так не сработает?

Любимый хостинг (http://beget.ru?id=2902) How can we grow old when the soundtrack of our lives is rock-n-roll?
N
На сайте с 06.05.2007
Offline
419
#38

у меня есть подобный сайт там 110 тыс комментов и 8 тыс фото c похожей структурой БД.

ну нету там никаких сортировок и временных таблиц.

Вот запрос примерно по-вашей методике :

explain select f.*,username as noteuser from `photo_comments` n left join `photo_photos` f on (f.id=n.photo) where n.rating=10.0 having f.approved=1 order by n.id desc limit 500,2;


+----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+-----------------------------+
| 1 | SIMPLE | n | ALL | NULL | NULL | NULL | NULL | 110103 | Using where; Using filesort |
| 1 | SIMPLE | f | eq_ref | PRIMARY | PRIMARY | 4 | xxxxxxx.n.photo | 1 | |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+-----------------------------+

а это до использования травы (having и left join) :

explain select f.*,username as noteuser from `photo_comments` n ,`photo_photos` f where f.id=n.photo and n.rating=10.0 and n.approved=1 order by n.id desc limit 500,2;


+----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+-------------+
| 1 | SIMPLE | n | index | photo | PRIMARY | 4 | NULL | 110103 | Using where |
| 1 | SIMPLE | f | eq_ref | PRIMARY | PRIMARY | 4 | xxxxxxx.n.photo | 1 | |
+----+-------------+-------+--------+---------------+---------+---------+-----------------+--------+-------------+

Сортировки нет!

Только вот точно оценить время я не могу. Получается примерно одинаково в обоих случаях от 0 до 1 сек.

Дисковый кеш и другие процессы сказываются. Да и 8мб данных это смех. Однако, я считаю, стоит верить explain-у.

там не VPS ?

Может вам mysql "разогнать" ? увеличить sort_buffer_size, join_buffer_size и тд?

D
На сайте с 05.06.2007
Offline
155
#39

netwind, сделал запрос идентичный вашему, всё равно для f => Using temporary; Using filesort

И хочу уточнить, у меня другой запрос, у вас не хватает where для таблицы f

Это у вас

where f.id=n.photo and n.rating=10.0 and n.approved=1

тут участвует только индекс от f.id и таблица n

Это мой

where f.id=n.foto and n.note=10 and f.ok=1 and f.view=0 and f.ero=0

тут участвуют обе таблицы, это и приводит у такому времени запроса 0.7 сек

Кстати что за феномен, убираю "order by n.id desc"

сразу пропадает Using temporary; Using filesort для f

У меня сервер... с оптимизацией самого mysql не заморачивался.. так как пока не прижало ))

Всё по умолчанию, ничего не менял

#
# * Fine Tuning
#
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
max_connections = 100
table_cache = 64
thread_concurrency = 10

join buffer size 131,072

sort buffer size 2,097,144

из переменных mysql

N
На сайте с 06.05.2007
Offline
419
#40

а если из order by убрать только desc, сортировка исчезнет?

похоже обратный порядок сортировки order by id desc и какие-то маленькие буферы не позволяет вашему серверу выполнить операцию без сортировки. А у меня позволяют.

а оно вам надо? похоже устранение этой сортировки погоды не сделает. все равно у вас всего 5мб данных. Если не заниматься корявыми левым объединениями, они не умножатся.

вот у меня к ночи нагрузка спала и любой вариант запросов к галерее выполняется за время близкое к нулю, а первичных данных для выборки в n у меня больше - 8 мб.

остаются индексы.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий