|
|
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
Есть сущности пользователь (user), вопрос (question), ответ (answer). Нужно вывести 10 пользователей у которых были самые популярные вопросы или ответы начиная с определенного момента времени. Сделал так, но время выполнения 20 секунд.... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 12:52:04 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
Все созданные индексы заносил в "возможные"... Видать из-за некорректности запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 12:54:10 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
покажите крейт табл ваших таблиц а то без индексов ничего сказать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 16:18:51 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
chabapokпокажите крейт табл ваших таблиц а то без индексов ничего сказать нельзя. Я их удалил уже, они были для creation_date_question и creation_date_answer - он их в возможные заносил. А это тут основное, ведь из-за этого перебор всех массивов идет. Нужно сам sql запрос упростить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 17:32:30 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
Навскидку - почитайте про селективность индекса и покрывающий индекс Дополнительно: если индекс построен по одному полю, то для поиска данных по нему сервер вынужден выполнить 2 операции: быстрый поиск в этом индексе требуемого значения и определение для него значения первичного ключа, а затем поиск по кластерному индексу значения первичного ключа и получение значений остальных полей таблицы. Очень вероятна ситуация (зависит от селективности индекса), когда сервер предпочтет этой схеме простой перебор строк по кластерному индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 19:07:56 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
Cygapb-007Навскидку - почитайте про селективность индекса и покрывающий индекс Дополнительно: если индекс построен по одному полю, то для поиска данных по нему сервер вынужден выполнить 2 операции: быстрый поиск в этом индексе требуемого значения и определение для него значения первичного ключа, а затем поиск по кластерному индексу значения первичного ключа и получение значений остальных полей таблицы. Очень вероятна ситуация (зависит от селективности индекса), когда сервер предпочтет этой схеме простой перебор строк по кластерному индексу. Да, селективность большая. Создал покрывающие индексы и он стал их использовать. НО на результативность запроса не повлияло, стало работать быстрее на доли секунды лишь. Видать из-за накладных расходов. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 19:48:39 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
Индексы такие: Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 19:49:52 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
ну вот и ответ вам условие ON (a.id_user = b.id_user); выполняется без использования индексов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 20:17:08 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
chabapokну вот и ответ вам условие ON (a.id_user = b.id_user); выполняется без использования индексов Это условие для таблицы <derived2> состоящей всегда из 10 элементов, смысла добавлять индекс нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 20:21:19 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
derived2 с 10 записями это у вас таблица а. А для таблицы b это условие выполняется без индексов. Сколько записей у вас в b? Вообще странно, у вас в эксплейне для b используется primary-ключ, а про индекс для user вы ничего не написали. Вобщем, мы возвращаемся к началу - надо крейт таблы, а не сказки про "я их удалил". т.к. без них нет полной картины и приходится проявлять телепатические способности чтобы понять что у вас там. Если вы удалили эти таблицы, то зачем вам оптимизировать запрос по ним? А если таблицы есть, что что мешает сделать show ctreate table? А еще тормозит у вас этап filesort, и по всей видимости - сильно. То что там limit 10 не должно вводить в заблуждение, т.к. всех пользователей оно сортирует, и только потом выбирает 10 первых. Я б шел по такому пути - выбирается 10 лидеров из одной таблицы, потом 10 из другой, потом юнион - и получаем 20 лидеров. А отсортировать 20 лидеров - это вам не 1000610. Но проблема в том, что запрос select * from x WHERE a>b ORDER BY d - нехорош тем, что индекс может использоваться либо для WHERE, либо для ORDER BY но не одновременно. Так что тут скорей всего, придется менять структуру базы и добавлять какие-то оптимизации этого момента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:16:55 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
авторпрос select * from x WHERE a>b ORDER BY d - нехорош тем, что индекс может использоваться либо для WHERE, либо для ORDER BY но не одновременно. бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:23:47 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
вобщем, навскидку, я бы наверное вел отдельную таблицу, из которой бы периодически чистил бы строки со старыми creation_date Тогда бы никакого WHERE не нужно было бы, т.к. в таблице гарантируются только новые записи. Но такое прокатывает, только если у вас диапазон времени всегда одинаков, скажем всегда последние Х дней. А если у вас кажждый раз это Х разное, то навскидку не скажешь, надо думать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:27:23 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
фраза "DERIVED" никому ничего не говорит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:29:55 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторпрос select * from x WHERE a>b ORDER BY d - нехорош тем, что индекс может использоваться либо для WHERE, либо для ORDER BY но не одновременно.бред.Не совсем бред. Для конкретного случая, когда поиск происходит по диапазону, увы, это реальность. Хотя в общем, конечно, так утверждать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:30:46 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
автор. Для конкретного случая, когда поиск происходит по диапазону, увы, это реальность. а пример дайте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:33:37 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
webslonНужно вывести 10 пользователей у которых были самые популярные вопросы или ответы начиная с определенного момента времени.Вы таки уточните задачу. А то предложенный запрос ее не решает. По крайней мере, он вполне может выдать и меньше 10 пользователей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:34:18 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
ScareCrowавтор. Для конкретного случая, когда поиск происходит по диапазону, увы, это реальность. а пример дайте?Пример чего именно? неиспользования индекса для обоих операций одновременно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:35:34 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
ну хоть чего нибудь дайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:35:57 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторпрос select * from x WHERE a>b ORDER BY d - нехорош тем, что индекс может использоваться либо для WHERE, либо для ORDER BY но не одновременно. бред. http://dev.mysql.com/doc/refman/5.5/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: ... You use ORDER BY on nonconsecutive parts of a key: SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2; ... The key used to fetch the rows is not the same as the one used in the ORDER BY: SELECT * FROM t1 WHERE key2=constant ORDER BY key1; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:36:11 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
моя версия запроса: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Эта версия имеет тот же недостаток - может выдать меньше 10 пользователей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:41:51 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
ScareCrowну хоть чего нибудь дайте.Могу дать уточнение - обычный B-Tree индекс не может одновременно использоваться для отбора записей по диапазону и сортировки по другому полю, однако может использоваться как источник данных, т.е. как покрывающий индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 22:48:43 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
miksoftмоя версия запроса: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Эта версия имеет тот же недостаток - может выдать меньше 10 пользователей. В том и проблема. Такой вариант сам рассматривал. Но нужно именно 10 всегда выводить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 23:24:04 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
chabapokderived2 с 10 записями это у вас таблица а. А для таблицы b это условие выполняется без индексов. Сколько записей у вас в b? Вобщем, мы возвращаемся к началу - надо крейт таблы, а не сказки про "я их удалил". т.к. без них нет полной картины и приходится проявлять телепатические способности чтобы понять что у вас там. Если вы удалили эти таблицы, то зачем вам оптимизировать запрос по ним? А если таблицы есть, что что мешает сделать show ctreate table? Я удалил не таблицы, а индексы все для этих таблиц. Сейчас только 2 индекса покрывающих есть a_cov и q_cov. Смысла в крейт таблы ну никак не вижу. Позволит вам разве что другие атрибуты посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 23:29:33 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
miksoftwebslonНужно вывести 10 пользователей у которых были самые популярные вопросы или ответы начиная с определенного момента времени.Вы таки уточните задачу. А то предложенный запрос ее не решает. По крайней мере, он вполне может выдать и меньше 10 пользователей. Мой запрос её не решает? Вроде решает всегда, кроме случаев когда для указанной даты не будет вопросов и ответов, но этим можно пренебречь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 23:32:50 |
|
||
|
Помогите оптимизировать запрос пожалуйста
|
|||
|---|---|---|---|
|
#18+
webslonНо нужно именно 10 всегда выводить.Тогда уточняйте задачу. Если какие-то из пользователей имеют несколько высокопопулярных запросов и несколько же ответов, то их как считать? за одного или за несколько? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 23:35:05 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=180&tid=1834919]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 355ms |

| 0 / 0 |
