|
|
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! есть два запроса: explain SELECT id_p1_espn, id_p2_espn, count(*) FROM espncricinfo.innings where IsValidBall = 1 AND runs_count > -1 AND id_p1_espn > -1 AND id_p2_espn > -1 GROUP BY id_p1_espn, id_p2_espn having count(*)>50 и explain SELECT * FROM espncricinfo.innings where IsValidBall = 1 AND runs_count > -1 AND id_p1_espn > -1 AND id_p2_espn > -1 GROUP BY id_p1_espn, id_p2_espn having count(*)>50 в о втором случае работает без индекса,долго-долго, в первом с индексом... НО, индекс, который используется в первом, выглядит следующим образом: 1. IdMatch 2.id_p1_espn 3.id_p2_espn 4.runs_count 5.IsValidBall почем оно использует этот индекс?! на сколько я понимаю, индекс берется, если поля в нем в том же порядке, что и в условии where, т.е. должно было бы быть where idMatch = 1 and id_p1_espn и т.д.... или я чего-то не понимаю?... хорошо, тогда почему со * оно не использует его? или он считает во втором как покрывающий его? но все равно, тут даже нет поля IdMatch которое идет ПЕРВЫМ в индексе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 16:33:04 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MargaritaMпочем оно использует этот индекс?!В этом индексе есть все поля, которые используются в первом запросе. Поэтому он может быть использован как покрывающий индекс. В этом случае происходит чтение данных из индекса вместо чтения из таблицы. Объем индекса меньше, чем объем таблицы, поэтому чтение происходит быстрее. Кроме того, если движок MyISAM, то индекс может быть закэширован в кэше индексов, тогда как содержимое таблицы MyISAM не кэширует, т.е. придется полагаться на внешние по отношению к MySQL кэши, такие как кэш файловой системы и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 16:39:59 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
miksoft, ну я так и подумала, про покрывающий, но была раньше уверена, что ВСЕ индексы подчиняются одинаковым правилам на счет порядка условий в where, не важно покрывающий или нет... Ну, по крайней мере не покрывающие, подчиняются же ему? а то может я совсем ничего не знаю) тогда хорошо, что нам мешает просто сделать громадный индекс из наиболее популярных полей и чтобы он для большинства запросов был покрывающим и все?... ну кроме замедления записи.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 17:34:14 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MargaritaMВСЕ индексы подчиняются одинаковым правилам на счет порядка условий в whereВсе индексы, которые оптимизатор просматривает на предмет ускорения доступа к данным в таблице. Т.е. это не сам индекс такой "покрывающий", это оптимизатор может использовать индексы в разных ролях. И один и тот же индекс в разных запросах может использоваться как обычном способом - для ускорения доступа к данным, так и как покрывающий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 17:48:20 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MargaritaMчто нам мешает просто сделать громадный индекс из наиболее популярных полей и чтобы он для большинства запросов был покрывающим и все?... ну кроме замедления записи..Иногда так и делают, когда индексный доступ к данным невозможен в силу самого запроса (например, LIKE '%подстрока%'), а таблица очень широкая, т.е. в ней много полей, которые не нужны в данном запросе. Причем иногда делают один индекс из нескольких полей, а иногда несколько индексов по одному полю, а иногда в комбинации - зависит от фактически выполняемых запросов и от требований к их быстродействию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 17:53:47 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MargaritaMпочем оно использует этот индекс?! на сколько я понимаю, индекс берется, если поля в нем в том же порядке, что и в условии where , т.е. должно было бы быть where idMatch = 1 and id_p1_espn и т.д.... или я чего-то не понимаю?... хорошо, тогда почему со * оно не использует его? или он считает во втором как покрывающий его? но все равно, тут даже нет поля IdMatch которое идет ПЕРВЫМ в индексе... Вот выделенное и не понимаешь. Порядок следования термов в WHERE (и HAVING) не имеет никакого значения, что вполне логично, потому что все булевы операции коммутативны . Для "индекс берётся" нет каких-то фиксированных логических правил -- оптимизатор считает стоимости нескольких возможных планов и берёт тот, у которого стоимость меньшая. Другой логики в общем не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 23:33:57 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MasterZivДля "индекс берётся" нет каких-то фиксированных логических правилВообще-то есть. В Оракле это называется rule-based optimizer. В MySQL нет отдельного понятия для этого, но кое-какие правила все равно есть. И стоимость считается только для тех индексов, которые прошли проверку этими правилами, если таковые индексы остались. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 00:03:31 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
miksoftMasterZivДля "индекс берётся" нет каких-то фиксированных логических правилВообще-то есть. В Оракле это называется rule-based optimizer. В MySQL нет отдельного понятия для этого, но кое-какие правила все равно есть. И стоимость считается только для тех индексов, которые прошли проверку этими правилами, если таковые индексы остались. Уже давно его нет даже в оракле, великом и ужасном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 00:14:37 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MargaritaM, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Эх, ЯростногоМеча на вас нет. Он бы не постеснялся, погразил бы вам палчиком за неагрегатную звездочку в агрегатном запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 00:28:22 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MasterZivПорядок следования термов в WHERE (и HAVING) не имеет никакого значенияиндекс на (x,y) 1) where x=const1 and y>const2 2) where y=const1 and x>const2 Никакого значения, да... или речь была вообще о чём-то другом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 05:36:44 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
ох, спасибо большое за информацию, пойду сокрушаться собственной безграмотности) tanglir индекс на (x,y) 1) where x=const1 and y>const2 2) where y=const1 and x>const2 Никакого значения, да... или речь была вообще о чём-то другом? И об этом в том числе. Я, глупая женщина, была уверена что имеет значение порядок. Иначе, зачем тогда создавать избыточные индексы например, если порядок не важен?... просто один из них для оптимизатора дешевле будет?... авторЭх, ЯростногоМеча на вас нет. Он бы не постеснялся, погразил бы вам палчиком за неагрегатную звездочку в агрегатном запросе. а если мне все столбцы надо?)) miksoftТ.е. это не сам индекс такой "покрывающий", это оптимизатор может использовать индексы в разных ролях ну это да, я понимаю... по крайне мере хотя бы это)) но, допустим, взял он этот индекс как покрывающий, запрос летает, все счастливы, все танцуют) но, получается,для запроса со * он посчитал, что ему дешевле полностью просканировать таблицу, чем воспользоваться этим индексом? Нет, я все не могу понять, откуда в моей голове взялась уверенность в связи порядка в индексе и в условии... еще и начальнику втирала с умным лицом, позорище!))) а в старых каких-нибудь версиях такого не было никогда? не могла же я приснить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 09:28:37 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
tanglirMasterZivПорядок следования термов в WHERE (и HAVING) не имеет никакого значенияиндекс на (x,y) 1) where x=const1 and y>const2 2) where y=const1 and x>const2 Никакого значения, да... или речь была вообще о чём-то другом? речь была о 1) where x=const1 and y>const2 1) where y>const2 and x=const1 как я понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 09:35:46 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
Диклевич Александр, ну да, я просто не обратила внимание, имелось ввиду именно 1) where x=const1 and y>const2 1) where y>const2 and x=const1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 09:42:33 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MargaritaMно, допустим, взял он этот индекс как покрывающий, запрос летает, все счастливы, все танцуют) но, получается,для запроса со * он посчитал, что ему дешевле полностью просканировать таблицу, чем воспользоваться этим индексом?Да, потому что для запроса со * этот индекс не является покрывающим. MargaritaMимелось ввиду именно 1) where x=const1 and y>const2 1) where y>const2 and x=const1Ну тут-то, понятное дело, разницы нет. А в моём примере - есть (впрочем, как выяснилось, пример был не в тему). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 12:08:33 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
tanglir, вы меня запутали!) авторMasterZiv Порядок следования термов в WHERE (и HAVING) не имеет никакого значения индекс на (x,y) 1) where x=const1 and y>const2 2) where y=const1 and x>const2 Никакого значения, да... т.е. вы говорите что в примере, который вы дали , нет разницы и потом автор MargaritaM имелось ввиду именно 1) where x=const1 and y>const2 1) where y>const2 and x=const1 Ну тут-то, понятное дело, разницы нет. А в моём примере - есть говорите что в этом нет разницы, а вашем есть... так где разница есть-то и есть ли она вообще?!) в общем мало, видимо, теории в моем багаже, поду перечитывать умные книги) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 15:28:29 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MargaritaM, 1. Порядок отдельных условий в WHERE блоке значения не имеет, а и b -- равнозначны а) where x=const1 and y>const2 b) where y>const2 and x=const1 2. если условия изменились, то , возможно нужен другой индекс, c и d не равнозначны c) where x=const1 and y>const2 d) where y=const1 and x>const2 3. Запрос на * несовменстим с агрегации. Уточните задачу и тогда будем думать над решением. Так как вы это сделали смысла не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:53:18 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
MargaritaMт.е. вы говорите что в примере, который вы дали , нет разницыВообще-то это был сарказм ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2014, 04:52:39 |
|
||
|
странно ведет себя индекс в запросе
|
|||
|---|---|---|---|
|
#18+
Диклевич Александрtanglirпропущено... индекс на (x,y) 1) where x=const1 and y>const2 2) where y=const1 and x>const2 Никакого значения, да... или речь была вообще о чём-то другом? речь была о 1) where x=const1 and y>const2 1) where y>const2 and x=const1 как я понимаю. Именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2014, 13:22:21 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38796534&tid=1833968]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 307ms |

| 0 / 0 |
