- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
это сейчас или раньше?
приведите полные тексты запросов и explain к каждому. и лучше без этой гадости phpшной - глаза сломать можно.
через пхп, но красивее )
(
[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, для обоих запросов выгоды в скорости не приносит )
дали бы explain не через php, нагляднее было бы. У вас там filesort из-за order by, надо индексы смотреть, структуры таблиц (show create table ...) - тогда можно и вывод сделать.
Dimanych, а если еще и left убирать? думаю, просто много данных в f и остается только тройной индекс создать
RAS,
я описывал структуру чуть ранее, индексы только на (id,foto - таблица n) и на (id,user - таблица f), другие индексы нехочу прописывать так как это становится не целесообразно.
Это единственный такой замороченный запрос, другие в основном по индексам и с одной таблицей..
netwind,
Как это left убрать. Ну убрал я его и получилось что и с having и без него теперь более 0.7сек..
Изменилась эта строчка для таблицы n: [Extra] => Using temporary; Using filesort (пропал where)
Скорее всего в моём случае тройной индекс ускорит запрос, но этот индекс мне потом только боком выйдет.. так как таблицы очень динамические.. и растут довольно таки быстро, нужно экономить используя только основные индексы, а не ставить их на все данные таблицы)
Всё таки оптимизация запросов не лёгкая задача ;)
Dimanych, честно говоря, не понимаю почему с HAVING это быстрее работает. Having без группировки в других субд вообще получается синтаксически неправильным.
может просто погрешности кеширования? вы в курсе про SQL_NO_CACHE ?
А если показать show create table будет просто удобнее воссоздать у себя и потестировать.
Нет, не погрешность кеширования, не 1 раз проверял..
Хотите попробовать, вот таблички, но их нужно забить чем то:
`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к )
фултекстсерч у муксула самый сильный?
Вот насчет фултекстсерча - нет.
А все остальное у него на ура. Заменять MySQL на Oracle или MSSQL (при условии того, что оптимизация на любой СУБД проводится максимальная) смысла нет.
sokol_jack добавил 10.12.2008 в 21:23
Так не сработает?
у меня есть подобный сайт там 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;
а это до использования травы (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;
Сортировки нет!
Только вот точно оценить время я не могу. Получается примерно одинаково в обоих случаях от 0 до 1 сек.
Дисковый кеш и другие процессы сказываются. Да и 8мб данных это смех. Однако, я считаю, стоит верить explain-у.
там не VPS ?
Может вам mysql "разогнать" ? увеличить sort_buffer_size, join_buffer_size и тд?
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
а если из order by убрать только desc, сортировка исчезнет?
похоже обратный порядок сортировки order by id desc и какие-то маленькие буферы не позволяет вашему серверу выполнить операцию без сортировки. А у меня позволяют.
а оно вам надо? похоже устранение этой сортировки погоды не сделает. все равно у вас всего 5мб данных. Если не заниматься корявыми левым объединениями, они не умножатся.
вот у меня к ночи нагрузка спала и любой вариант запросов к галерее выполняется за время близкое к нулю, а первичных данных для выборки в n у меня больше - 8 мб.
остаются индексы.