Cache/Re-Use Подзапрос в MySQL

Вы можете использовать groupby в сочетании с .agg и передать ему функции mean и std:

print(df.groupby(['colour', 'item']).agg({'price':['mean', 'std']}).reset_index())

  colour item  price          
                mean       std
0   blue  cup  2.300       NaN
1   blue  jug  2.400       NaN
2    red  cup  1.625  0.176777
14
задан Doug Kaye 18 March 2009 в 16:47
поделиться

1 ответ

Посмотрите что EXPLAIN EXTENDED говорит.

Если это говорит DEPENDENT SUBQUERY или UNCACHEABLE SUBQUERY, затем это будет переоценено каждый раз, когда это используется.

Это происходит, если подзапрос использует переменные сеанса или является связанным подзапросом.

Если это не сделает, то это по всей вероятности будет кэшироваться.

Если Ваш случай, подзапрос не будет кэшироваться, он будет переоценен в каждом UNION'редактор установил.

Вы подзапрашиваете, тем не менее, кажется, является слишком сложным. Почему не делают Вас, просто используйте:

SELECT id
FROM   playlist_program_map ppm, programs p
WHERE  ppm.playlist_id = 181
       AND p.id = ppm.program_id
       AND submitter_id = 32
       AND feed_id = 2478

Если у Вас есть индекс на playlist_program_map (playlist_id), этот запрос должен работать как очарование.

Могли Вы говорить мне еще две вещи:

  1. В скольких строки находятся там playlist_program_map и сколько DISTINCT playlist_id значения там?
    • В скольких строки находятся там programs и сколько DISTINCT submitter_id, feed_id пары там?

Из Вашего комментария я могу прийти к заключению, что существует 10 programs на playlist в среднем, и 200 programs на (submitter, feed) пара. Это означает Ваш индекс на playlist_program_map является более выборочным, чем тот на (submitter, feed), и playlist_program_map должно быть ведущим в соединении.

Полнотекстовый индекс в Вашем случае также, кажется, не является очень выборочным, учитывая, что необходимо присоединиться к 10 программам из 2,000,000.

Можно лучше попробовать следующее:

SELECT object_id, programs.created AS created
FROM   playlist_program_map ppm, programs p, comments_programs cp
WHERE  ppm.playlist_id = 181
       AND p.id = ppm.program_id
       AND p.submitter_id = 32
       AND p.feed_id = 2478
       AND cp.object_id = p.id
       AND cp.text REGEXP 'excellent'

, и повторите это для всех трех таблиц.

8
ответ дан 1 December 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: