|
|
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
Существует несколько таблиц (с большими количествами записей), выборка из которых в более чем 95% случаев делается с условием отбора записей по не уникальному полю. Для упрощения возьмем пример: TaskID - PK, clustered index; ClusterID - non unique, secondary index; Другие поля... Индекс по этому полю ClusterID конечно имеется, но логическая особенность данных в любой из этих таблиц состоит в том, что записи с одним значением ClusterID разбросаны по всем страницам таблицы, поэтому SELECT * ... WHERE ClusterID=1097 вызывает много чтений с диска. Запросов много и диски сильно загружены. Предполагаемый мной вариант решения проблемы: реорганизация хранения данных так, чтобы все записи с одинаковым ClusterID хранились рядом друг с другом. Насколько я знаю, нет возможности сделать кластерный индекс по не уникальному полю ни в MySQL, ни в других старых добрых SQL. Если все-таки есть - подскажите! Фактически должно получиться решение, как будто использующее какой-либо Key-Value storage, но сохраняющее при этом возможности обработки SQL-запросов по отношению к тому, что содержится в Value. Я никогда ранее не имел дело с такими СУБД, поэтому желательно от вас получить несколько вариантов, чтобы потом выбрать наиболее подходящий по другим условиям проекта. Возможности Оракла не предлагать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 21:13:43 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
движок таблицы какой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 22:18:54 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
Реально ли в запросе нужны все поля таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 22:19:50 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
авторНасколько я знаю, нет возможности сделать кластерный индекс по не уникальному полю ни в MySQL, ни в других старых добрых SQL чего? где вы такое прочитали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 23:26:41 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
партиционирование сделайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 23:45:18 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
Kulavertзаписи с одним значением ClusterID разбросаны по всем страницам таблицы, поэтому SELECT * ... WHERE ClusterID=1097 вызывает много чтений с диска.Это сколько ж на сервере оперативы, какой же объём таблиц и сколько записей тащится таким запросом? По уму - надо делать так, чтобы такие разрозненные таблицы кэшировались полностью или около того - пусьт даже ценой деления таблицы на две части со связью 1:1. Можно ещё сопроводить процесс партиционированием - тоже способствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 23:48:00 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
Kulavert, В myIsam не знаю, а в inno вообще вся бд - одно большое кластерное дерево. В любом индексе спереди идут поля ид таблицы, ид индекса, затем поля индекса, затем — версия записи. Затем либо сами данные, либо значения полей первичного ключа. В итоге да, "кластерный" индекс по неуникальному не создать... В общем, все написано тут: dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html А на счет других субд ты неправ, кластерные индексы могут быть как уникальными , так неуникальными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 02:48:20 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
miksoftдвижок таблицы какой? InnoDB, но при необходимости можно рассмотреть изменение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 08:09:17 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
miksoftРеально ли в запросе нужны все поля таблицы? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 08:09:45 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторНасколько я знаю, нет возможности сделать кластерный индекс по не уникальному полю ни в MySQL, ни в других старых добрых SQL чего? где вы такое прочитали? Вот здесь конкретно про MySQL 5.5: 14.3.5.13.2. Clustered and Secondary Indexes Про остальные СУБД: я почитал про PostgreSQL и MS SQL (уже закрыл источник...) - там не написано прямо, что нельзя, но написано прямо, что движок делает индекс из уникального поля... Возможно я неправильно понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 08:15:37 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
Кластерный индекс ОБЯЗАН строиться по уникальному полю - просто исходя из смысла этого индекса. Думая о том, почему так, извольте абстрагивроваться от существования такой хрени как физическое хранение данных в конкретных блоках конкретной файловой системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 08:48:01 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
AkinaКластерный индекс ОБЯЗАН строиться по уникальному полю - просто исходя из смысла этого индекса. Думая о том, почему так, извольте абстрагивроваться от существования такой хрени как физическое хранение данных в конкретных блоках конкретной файловой системы. Нет , в смысле кластерного индекса уникальность не подразумевается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 09:14:26 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
MasterZivв смысле кластерного индекса уникальность не подразумевается. Не согласен. Смысл кластерного индекса в том числе и в том, что местоположение элемента в нём определяется значением индексного выражения однозначно. В случае неуникальности индексного выражения индекс таким свойством не обладает - порядок взаимного расположения записей с совпадающим значением индексного выражения не определён. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 09:17:44 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
в смысле кластерного индекса уникальность не подразумевается. Не согласен. Смысл кластерного индекса в том числе и в том, что местоположение элемента в нём определяется значением индексного выражения однозначно. Смысл к.и. в том, что записи располагаются физически в каком-то порядке. Однозначность не требуется. Полно субд, где к.и. могут быть неуникальными. Aubade ase, Ms SQL, oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 09:29:28 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
Почти любую вещь МОЖНО использовать эффективно, неэффективно и через задницу. Никто не запрещает сделать кластерным индекс по часто обновляющемуся полю. Никто не запрещает сделать кластерный индекс по блобу. Никто не запрещает сделать кластерный индекс по неуникальному полю. Но всё это не означает, что так НАДО делать. Если в одной СУБД не стали реализовывать всякую [censored], а в другой решили, что каждый ССЗБ, и сделали, то это ещё ба-альшой вопрос, кто более разумен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:04:31 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
KulavertmiksoftРеально ли в запросе нужны все поля таблицы? Да.Можно попробовать сделать покрывающий индекс, начинающийся с поля ClusterID, но он будет сильно неэффективным по занимаемому месту. Да и модификация таблицы замедлится. Еще можно попробовать внести поле ClusterID первым полем в первичный ключ, но это уже зависит от логики БД и, возможно, потребуется модификация софта, который работает с этой табличкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:40:51 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
AkinaЭто сколько ж на сервере оперативы, какой же объём таблиц и сколько записей тащится таким запросом? По уму - надо делать так, чтобы такие разрозненные таблицы кэшировались полностью или около того - пусьт даже ценой деления таблицы на две части со связью 1:1. Можно ещё сопроводить процесс партиционированием - тоже способствует. Сейчас в сумме около 500млн записей в таких таблицах. Запрос возвращает в типовом варианте от 500 до 2000 записей, максимум 10000. Оперативки выделено 32Гб, но на кэширование всего ее не хватает. Даже если ее размер увеличить сейчас, то в будущем будет нужно еще и еще... Экстенсивный путь всегда ограничен доступными ресурсами (в данном случае платятся свои деньги, а не заказчика, государства, газпрома и т.п.). Нужно произвести оптимизацию, пока это не слишком сложно, а когда начнется шардинг и другие современные полезности, то изменения структуры, движков и т.п. станут на порядок сложнее. Обдумав сказанное всеми вами, сейчас рассматриваю следующие варианты: 1) Сделать уникальное поле, содержащее каким-либо образом ClusterID, и скорее всего текстовое. При этом можно попробовать заодно решить еще задачу оптимизации сортировки дерева при выдаче результата (есть такая потребность в одной из таблиц); 2) Сменить СУБД на PostgreSQL. Покурил мануал: там можно использовать команду CLUSTER и всякие настройки для ее оптимальной работы. Но там тоже много тараканов: а) требуется дополнительное однократное (по отн. к размеру таблицы) либо двукратное место на диске для хранения индекса, а значит движок будет этот файл использовать со всеми вытекающими... б) все равно новые записи не будут автоматически вставляться на ту же самую дисковую страницу соответственно ClusterID, а тупо дописываться в конец, что немного ухудшает результат; 3) Сделать партиционирование конкретных таблиц (не меняя СУБД). Но тут мне не все ясно. Например, как указать движку, на каком именно диске нужно хранить конкретную партицию? Без этого эффект партиционирования мне кажется неполноценным. Но зато есть огромный плюс: партиционирование делается офигенно просто :) Переход на MSSQL и на Оракл не рассматриваю, т.к. перечисленные мной выше варианты представляются гораздо менее затратными и более эффективными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:25:56 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
Kulavert, У тебя комплексные проблемы, так с кондачка в форуме с ними не разберешься... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:51:28 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
Kulavert, Погляди хотя бы на express редакции оракла и мс скуля. Ну и PG, конечно. MySQL конечно не лучшая в мире субд, но и с ней можно подрыгаться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:56:19 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
MasterZivУ тебя комплексные проблемы, так с кондачка в форуме с ними не разберешься... Поэтому стараюсь отвечать на уточняющие вопросы и предлагаю для оценки уже более-менее обдуманные варианты... По описанным мной выше трем вариантам кто что может подсказать? В частности по партиционированию: можно ли как-то добиться, чтобы партиции были на разных дисках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 12:10:49 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
авторСделать партиционирование конкретных таблиц (не меняя СУБД). Но тут мне не все ясно. Например, как указать движку, на каком именно диске нужно хранить конкретную партицию? Без этого эффект партиционирования мне кажется неполноценным. Но зато есть огромный плюс: партиционирование делается офигенно просто :) симлинк. но глубина анализа просто поражает. ты бы хоть конктерыне данные дал. железо, диски, характеристику базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 13:06:47 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
KulavertОперативки выделено 32ГбА MySQL-то настроен, чтобы эффективно их использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 13:20:07 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
KulavertMasterZivУ тебя комплексные проблемы, так с кондачка в форуме с ними не разберешься... Поэтому стараюсь отвечать на уточняющие вопросы и предлагаю для оценки уже более-менее обдуманные варианты... По описанным мной выше трем вариантам кто что может подсказать? В частности по партиционированию: можно ли как-то добиться, чтобы партиции были на разных дисках? Для начала скажи, какой у тебя движок таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 15:19:48 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 15:26:48 |
|
||
|
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
|
|||
|---|---|---|---|
|
#18+
KulavertmiksoftРеально ли в запросе нужны все поля таблицы? Да.Можно сделать фильтрующий подзапрос, возвращающий PK, и связать с ним всю таблицу по JOIN. В этом случае в покрывающем индексе будут только поля, необходимые для фильтрации записей, а в итоговый результат попадут все поля исходной таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 15:32:45 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38481058&tid=1835629]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 207ms |
| total: | 357ms |

| 0 / 0 |
