|
|
|
Индексы для чайников (MySQL, SQL Server, Access)
|
|||
|---|---|---|---|
|
#18+
Поработав некоторое время с SQL Server и Access, начал осваивать MySQL и споткнулся буквально на пороге: пытка сделать inner join двух идентичных таблиц по 200 000 записей в каждой, отправляла MySQL в нокаут (результатов ни разу не дождался). Наконец меня осенило сделать им индекс, в точности соответсвующий условиям join'а и дело пошло. Т.е. получается, что для MySQL желательно создавать специальные индексы для каждого JOIN и WHERE, дабы дать ему инструмент поиска нужных записей отличный от полного перебора? С другой стороны Access, откуда как раз и приехали в MySQL 2 упомянутые таблицы, справлялся с задачей за 3 секунды, и его, похоже, не напрягало, что условия JOINа не совпадали с основным ключем (join был по части полей основного ключа и нескольким неключевым полям). В SQL Server я тоже никогда не занимался созданием индексов и проблем с производительностью не испытывал (возможно, благодаря мощному серверу на котором он стоит). Чего такого умеют Access и SQL Server, чего не умеет MySQL? Получается, что первые сами строят всевозможные индексы, а MySQL оставляет это на совести пользователя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2010, 10:43 |
|
||
|
Индексы для чайников (MySQL, SQL Server, Access)
|
|||
|---|---|---|---|
|
#18+
Максим М., например, они могут уметь делать не только loop join, но и hash join и merge join. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2010, 16:36 |
|
||
|
Индексы для чайников (MySQL, SQL Server, Access)
|
|||
|---|---|---|---|
|
#18+
Еще нужно учитывать, что дефолтовые настройки MySQL подходят далеко не для всех задач. А так же и то, что у MySQL почти отсутствует кэш таблиц MyISAM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2010, 17:31 |
|
||
|
Индексы для чайников (MySQL, SQL Server, Access)
|
|||
|---|---|---|---|
|
#18+
lockyМаксим М., например, они могут уметь делать не только loop join, но и hash join и merge join. Я имел в виду неочевидные особенности работы с индексами при переходе с Access на MySql. Сейчас я уже потихоньку привыкаю к тому, что если хочешь ускорить работу joinа - надо сделать ему индекс по соответствующим полям, иначе mysql будет делать декартово произведение с последующим его полным перебором. В этом свете становится совершенно непонятным, как Access справляется с join'ами без явного указания индексов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2010, 18:04 |
|
||
|
Индексы для чайников (MySQL, SQL Server, Access)
|
|||
|---|---|---|---|
|
#18+
Максим М.В этом свете становится совершенно непонятным, как Access справляется с join'ами без явного указания индексов? Например, при помощи merge join, hash join... Хотя я не уверен, что они в нём есть. Но, с другой стороны, не вижу причин, почему бы им там не быть. ну и плюс - другой оптимизатор, что есть тоже немаловажно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2010, 18:07 |
|
||
|
Индексы для чайников (MySQL, SQL Server, Access)
|
|||
|---|---|---|---|
|
#18+
Максим М.В этом свете становится совершенно непонятным, как Access справляется с join'ами без явного указания индексов? Во-первых. То, что нету явно построенных индексов - в случае аксеса вовсе не значит, что индексов нет совсем. Например при построении связи между таблицами (в схеме базы данных) аксес сам создает "вспомогательный" индекс по соответствующим полям. Во-вторых. Если нет ни явных индексов, ни связей (с неявносозданными индексами), то это всё равно не значит, что индексов нету. Аксес умеет строить временные индексы, если оно выгодно. В файл-серверной архитектуре такое поведение позволительно, т.к. тратятся только ресурсы клиента, остальных пользователей оно не затрагивает. В-третьих. Какой-никакой, а оптимизатор у аксеса имеется, и для своего класса (класса приложения) - вполне приличный. Если MySQL на каждый чих начинает строить декартово произведение, то это лишь повод удивляться, почему MySQL себя так ведёт, а вовсе не повод удивляться, почему другие ведут себя нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2010, 20:34 |
|
||
|
|

start [/forum/topic.php?fid=35&msg=36655934&tid=1552802]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 157ms |

| 0 / 0 |
