|
|
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
miksoftsgalaбудет за 0.22 с файлсортом, т.к. индекс для ордеринга включается только если (фанфары) выбираются записи из первой трети. а поскольку там 60к записей с лишним, то 40к заплевывает в оставшиеся 70% и пролетайло получается дляа можно ссылочку на такое?В старом мануале (по 5.4.3 это было прямо в разделе про индексы, но я уже потерял ту ссылку) :) В свежем мануале http://dev.mysql.com/doc/refman/5.7/en/where-optimizations.html говорится что строгого правила про 30% уже нет, At one time, a scan was used based on whether the best index spanned more than 30% of the table, but a fixed percentage no longer determines the choice between using an index or a scan. The optimizer now is more complex and bases its estimate on additional factors such as table size, number of rows, and I/O block size. но по факту у меня на практике получилось как раз 30% граница miksoftА когда выбирается 2/3 записей логично, что индекс не поможет.Побуду занудой. Как раз помог. С индексом (форсе индекс) выбирается за 0.05, без индекса за 0.22. Вот теперь мне бы этот индекс к "большому" запросу прикрутить как-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2016, 23:43 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
miksoftsgalaя уже перепробовал с десяток разных вариантов, но как это вкрячить в запрос Код: sql 1. категорически не понимаю:( что бы именно для ордера и все такое. Есть какие-то идеи? Тут получается, что отбор идет по одной таблице, а сортировка по другой. Имхо, хорошего варианта не получится. Поэтому и приходится придумывать обходные варианты. Например, все тот же перенос поля для сортировки в таблицу categories_rel. mysql-ный мануал говорит что должно работать если колонка "ордер бай" из первой константной таблицы, а у меня запрос именно такой. Т.е. первая таблица как раз с ордербаем и константная дальше ехать некуда. http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html In some cases, MySQL cannot use indexes to resolve the ORDER BY, although it still uses indexes to find the rows that match the WHERE clause. These cases include the following: The query joins many tables, and the columns in the ORDER BY are not all from the first nonconstant table that is used to retrieve rows. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2016, 23:46 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
sgalaТ.е. первая таблица как раз с ордербаем и константная дальше ехать некуда.Константная-то как раз вторая, судя по where b .catid=982734 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 02:23 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
sgala. Вариант 1 Код: sql 1. Может я не догоняю чего-то очевидного? ты не умеешь писать запросы. left join categories_rel b on a.goodid=b.goodid where b.catid=982734 left join тут не нужен нигде, ты фильтруешь по этой таблице b. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2016, 08:13 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
sgalaЛюбопытно, поставил 5.6. На 5.1 работал запрос Код: sql 1. отрабатывал за 4с на 5.6 такой запрос возвращает ошибку (1054 - Неизвестный столбец 'SQL_NO_CACHE' в 'field list') ну а Код: sql 1. отрабатывает за 0.3 секунды, что ЗНАЧИТЕЛЬНО лучше чем 4 секунды на 5.1. По профайлингу получается 0.2 секунды из 0.3 это "sending data". explain тоже другой 1 SIMPLE <subquery2> ALL NULL NULL NULL NULL NULL Using temporary; Using filesort 1 SIMPLE goods eq_ref PRIMARY PRIMARY 4 <subquery2>.qid 1 NULL 2 MATERIALIZED categories_rel ref catid,goodid catid 4 const 45180 NULL Это значит в 5.6 этот баг уже поправили? К сожалению 0.3 секунды не вариант:( Нужно на порядок меньше. там не было бага. Если форумчане так говорят, то это всего лишь такая местная шуточка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2016, 08:18 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
MasterZivтам не было бага. Если форумчане так говорят, то это всего лишь такая местная шуточка.Это был официальный баг, многократно зарегистрированный в багтрекере. Вот бегло удалось найти несколько: https://bugs.mysql.com/bug.php?id=9090 https://bugs.mysql.com/bug.php?id=32665 https://bugs.mysql.com/bug.php?id=4040 Попутно нашел заметку про это одного из разработчиков MySQL - http://oysteing.blogspot.ru/2012/07/from-months-to-seconds-with-subquery.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 00:12 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
miksoftsgalaТ.е. первая таблица как раз с ордербаем и константная дальше ехать некуда.Константная-то как раз вторая, судя по where b .catid=982734да, тупанул. спасибо. Буду думать что с этим делать. [quot MasterZiv]sgala. ты не умеешь писать запросы. left join categories_rel b on a.goodid=b.goodid where b.catid=982734 left join тут не нужен нигде, ты фильтруешь по этой таблице b.То что я делаю как-то неправильно это я понимаю, иначе не были бы такие результаты. Не могли бы вы подсказать как в моей ситуации сделать правильно? Если думаете предложить вариант с вложенным запросом - обратите внимание на то, что один из таких вариантов уже был приведен, обсужден и отвергнут. miksoft , попробовал сделать таблицу чисто для сортировки "goodid, categoryid, orderid". В принципе стало получше, правда не знаю к чему это приведет когда добавлю еще полей. Что бы стало совсем хорошо попробовал сделать из нее memory table и вот тут был удивлен (обе таблицы myisam, индексы btree, smallint, mediumint, mediumint). Во-первых размеры. memory таблица с нужными ключами улетает за 1500мб, в то время как myisam занимает культурные 244мб. Мало того что "размер строки" (без индексов) в memory 21 байт против 9 байт в myisam (откуда 21-то? на 3 поля по 4 байта = 12 должно быть вроде). Так еще и ключи занимают почти в 4 раза больше места. Во-вторых разница в эксплеинах. Таблицы полностью одинаковые, на всякий случай сделал optimize, analyze и даже ребутнул сервер. Запрос SELECT * FROM `goodsORD` WHERE catid=85798 order by orderid limit 40000,50 Но memory эксплеин выглядит как id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE goodsORD ref orderid orderid 2 const 733 Using where А myisam-овский id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE goodsORD ref orderid orderid 2 const 64139 Using where Т.е. вот тут я вообще не понял. Какого черта (при чем эксплеины запускал несколько раз, ситуация аналогичная, хотя цифры могут плавать) в myisam-овской таблице при всех прочих равных - ему нужно перебрать в 100 раз больше строк ?! Т.е. по сути все, а memory довольствуется 733 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 01:55 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
sgala, я же написал, тебе не нужен left join. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 12:22 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
а почему никто еще не написал что limit 40000,50 тормозит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 12:38 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
MasterZivsgala, я же написал, тебе не нужен left join.так что нужно-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 16:47 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
sgala, [inner] join ну и в самомделе, зачем вам лимит 40000? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 06:41 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
tanglirsgala, [inner] join ну и в самомделе, зачем вам лимит 40000?с inner join та же самая ерунда. т.е. даже эксплеин один в один. лимит 40к нужен по причине пейджинации, от которой к сожалению не избавиться. а огромное количество категорий и разных вариантов сортировок и фильтров не позволяет заранее вычислить "края" для пейджинации, точнее это будет выполняться за непозволительно большое время и при добавлении каждого товара придется это дело перестраивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2016, 18:54 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
уважаемые, подскажите еще такой момент. очень долго отрабатывает запрос когда он делается первый раз. я выключил query_cache, в запросах подставляю sql_no_cache, т.е. мускульное кэширование не срабатывает. но запросы вида goodid in (50 значений) работают ОЧЕНЬ долго запускаясь первый раз, хотя казалось бы куда проще-то запрос. вплоть до 5 секунд, хотя со второго раза стабильно укладываются в 0.05 секунды, а то и 0.005 секунды даже. если чутка подождать, то время увеличивается до 0.5 секунды. при чем эксплеин показывает index: range. никакого файлсорта и прочей ерунды отчего такая ерунда? key_buffer_size выставил в 1024м - казалось бы индексы всяко должны быть в памяти (всего их 700мб) но не фига не помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 13:18 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
sgalakey_buffer_size выставил в 1024м - казалось бы индексы всяко должны быть в памяти (всего их 700мб) но не фига не помогает.Откуда им быть в памяти, если их до этого никто не читал? Сам по себе кэш индексов не заполняется, а только по мере использования этих индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 01:32 |
|
||
|
казалось бы классический запрос, но тормозит, categories_rel и goods , не могу понять
|
|||
|---|---|---|---|
|
#18+
miksoftsgalakey_buffer_size выставил в 1024м - казалось бы индексы всяко должны быть в памяти (всего их 700мб) но не фига не помогает.Откуда им быть в памяти, если их до этого никто не читал? Сам по себе кэш индексов не заполняется, а только по мере использования этих индексов. э. вы хотите сказать, что файл индексов (при достаточности памяти) попадет в память ПОЛНОСТЬЮ тогда и ТОЛЬКО тогда когда все индексы хоть раз прочитаны? я почему-то считал что индексный файл грузится в память если не при старте мускула, то как минимум после первого обращения. если я правильно понял что вы хотели сказать, то есть ли какой-то вариант "прогрева" файла индексов? что бы он таки оказался полностью в памяти и уже не мучал мозг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 04:22 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39255382&tid=1831585]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
13ms |
get forum data: |
1ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 349ms |

| 0 / 0 |
