Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение / 25 сообщений из 33, страница 1 из 2
27.11.2013, 21:13:43
    #38480710
Kulavert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Существует несколько таблиц (с большими количествами записей), выборка из которых в более чем 95% случаев делается с условием отбора записей по не уникальному полю. Для упрощения возьмем пример:
TaskID - PK, clustered index;
ClusterID - non unique, secondary index;
Другие поля...

Индекс по этому полю ClusterID конечно имеется, но логическая особенность данных в любой из этих таблиц состоит в том, что записи с одним значением ClusterID разбросаны по всем страницам таблицы, поэтому SELECT * ... WHERE ClusterID=1097 вызывает много чтений с диска. Запросов много и диски сильно загружены.
Предполагаемый мной вариант решения проблемы: реорганизация хранения данных так, чтобы все записи с одинаковым ClusterID хранились рядом друг с другом. Насколько я знаю, нет возможности сделать кластерный индекс по не уникальному полю ни в MySQL, ни в других старых добрых SQL. Если все-таки есть - подскажите!
Фактически должно получиться решение, как будто использующее какой-либо Key-Value storage, но сохраняющее при этом возможности обработки SQL-запросов по отношению к тому, что содержится в Value. Я никогда ранее не имел дело с такими СУБД, поэтому желательно от вас получить несколько вариантов, чтобы потом выбрать наиболее подходящий по другим условиям проекта.
Возможности Оракла не предлагать :)
...
Рейтинг: 0 / 0
27.11.2013, 22:18:54
    #38480775
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
движок таблицы какой?
...
Рейтинг: 0 / 0
27.11.2013, 22:19:50
    #38480779
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Реально ли в запросе нужны все поля таблицы?
...
Рейтинг: 0 / 0
27.11.2013, 23:26:41
    #38480848
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
авторНасколько я знаю, нет возможности сделать кластерный индекс по не уникальному полю ни в MySQL, ни в других старых добрых SQL
чего? где вы такое прочитали?
...
Рейтинг: 0 / 0
27.11.2013, 23:45:18
    #38480864
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
партиционирование сделайте.
...
Рейтинг: 0 / 0
27.11.2013, 23:48:00
    #38480869
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Kulavertзаписи с одним значением ClusterID разбросаны по всем страницам таблицы, поэтому SELECT * ... WHERE ClusterID=1097 вызывает много чтений с диска.Это сколько ж на сервере оперативы, какой же объём таблиц и сколько записей тащится таким запросом? По уму - надо делать так, чтобы такие разрозненные таблицы кэшировались полностью или около того - пусьт даже ценой деления таблицы на две части со связью 1:1. Можно ещё сопроводить процесс партиционированием - тоже способствует.
...
Рейтинг: 0 / 0
28.11.2013, 02:48:20
    #38480998
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Kulavert,

В myIsam не знаю, а в inno вообще вся бд - одно большое кластерное дерево.


В любом индексе спереди идут поля ид таблицы, ид индекса, затем поля индекса, затем — версия записи. Затем либо сами данные, либо значения полей первичного ключа.

В итоге да, "кластерный" индекс по неуникальному не создать...

В общем, все написано тут:

dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

А на счет других субд ты неправ, кластерные индексы могут быть как уникальными , так неуникальными.
...
Рейтинг: 0 / 0
28.11.2013, 08:09:17
    #38481057
Kulavert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
miksoftдвижок таблицы какой?
InnoDB, но при необходимости можно рассмотреть изменение.
...
Рейтинг: 0 / 0
28.11.2013, 08:09:45
    #38481058
Kulavert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
miksoftРеально ли в запросе нужны все поля таблицы?
Да.
...
Рейтинг: 0 / 0
28.11.2013, 08:15:37
    #38481062
Kulavert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
ScareCrowавторНасколько я знаю, нет возможности сделать кластерный индекс по не уникальному полю ни в MySQL, ни в других старых добрых SQL
чего? где вы такое прочитали?
Вот здесь конкретно про MySQL 5.5: 14.3.5.13.2. Clustered and Secondary Indexes
Про остальные СУБД: я почитал про PostgreSQL и MS SQL (уже закрыл источник...) - там не написано прямо, что нельзя, но написано прямо, что движок делает индекс из уникального поля... Возможно я неправильно понял...
...
Рейтинг: 0 / 0
28.11.2013, 08:48:01
    #38481085
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Кластерный индекс ОБЯЗАН строиться по уникальному полю - просто исходя из смысла этого индекса. Думая о том, почему так, извольте абстрагивроваться от существования такой хрени как физическое хранение данных в конкретных блоках конкретной файловой системы.
...
Рейтинг: 0 / 0
28.11.2013, 09:14:26
    #38481105
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
AkinaКластерный индекс ОБЯЗАН строиться по уникальному полю - просто исходя из смысла этого индекса. Думая о том, почему так, извольте абстрагивроваться от существования такой хрени как физическое хранение данных в конкретных блоках конкретной файловой системы.

Нет , в смысле кластерного индекса уникальность не подразумевается.
...
Рейтинг: 0 / 0
28.11.2013, 09:17:44
    #38481109
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
MasterZivв смысле кластерного индекса уникальность не подразумевается.
Не согласен. Смысл кластерного индекса в том числе и в том, что местоположение элемента в нём определяется значением индексного выражения однозначно. В случае неуникальности индексного выражения индекс таким свойством не обладает - порядок взаимного расположения записей с совпадающим значением индексного выражения не определён.
...
Рейтинг: 0 / 0
28.11.2013, 09:29:28
    #38481123
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
в смысле кластерного индекса уникальность не подразумевается.

Не согласен. Смысл кластерного индекса в том числе и в том, что местоположение элемента в нём определяется значением индексного выражения однозначно.

Смысл к.и. в том, что записи располагаются физически в каком-то порядке. Однозначность не требуется.
Полно субд, где к.и. могут быть неуникальными. Aubade ase, Ms SQL, oracle
...
Рейтинг: 0 / 0
28.11.2013, 10:04:31
    #38481167
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Почти любую вещь МОЖНО использовать эффективно, неэффективно и через задницу.

Никто не запрещает сделать кластерным индекс по часто обновляющемуся полю.
Никто не запрещает сделать кластерный индекс по блобу.
Никто не запрещает сделать кластерный индекс по неуникальному полю.

Но всё это не означает, что так НАДО делать.

Если в одной СУБД не стали реализовывать всякую [censored], а в другой решили, что каждый ССЗБ, и сделали, то это ещё ба-альшой вопрос, кто более разумен.
...
Рейтинг: 0 / 0
28.11.2013, 10:40:51
    #38481234
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
KulavertmiksoftРеально ли в запросе нужны все поля таблицы?
Да.Можно попробовать сделать покрывающий индекс, начинающийся с поля ClusterID, но он будет сильно неэффективным по занимаемому месту. Да и модификация таблицы замедлится.

Еще можно попробовать внести поле ClusterID первым полем в первичный ключ, но это уже зависит от логики БД и, возможно, потребуется модификация софта, который работает с этой табличкой.
...
Рейтинг: 0 / 0
28.11.2013, 11:25:56
    #38481345
Kulavert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
AkinaЭто сколько ж на сервере оперативы, какой же объём таблиц и сколько записей тащится таким запросом? По уму - надо делать так, чтобы такие разрозненные таблицы кэшировались полностью или около того - пусьт даже ценой деления таблицы на две части со связью 1:1. Можно ещё сопроводить процесс партиционированием - тоже способствует.
Сейчас в сумме около 500млн записей в таких таблицах. Запрос возвращает в типовом варианте от 500 до 2000 записей, максимум 10000. Оперативки выделено 32Гб, но на кэширование всего ее не хватает. Даже если ее размер увеличить сейчас, то в будущем будет нужно еще и еще... Экстенсивный путь всегда ограничен доступными ресурсами (в данном случае платятся свои деньги, а не заказчика, государства, газпрома и т.п.). Нужно произвести оптимизацию, пока это не слишком сложно, а когда начнется шардинг и другие современные полезности, то изменения структуры, движков и т.п. станут на порядок сложнее.

Обдумав сказанное всеми вами, сейчас рассматриваю следующие варианты:
1) Сделать уникальное поле, содержащее каким-либо образом ClusterID, и скорее всего текстовое. При этом можно попробовать заодно решить еще задачу оптимизации сортировки дерева при выдаче результата (есть такая потребность в одной из таблиц);
2) Сменить СУБД на PostgreSQL. Покурил мануал: там можно использовать команду CLUSTER и всякие настройки для ее оптимальной работы. Но там тоже много тараканов:
а) требуется дополнительное однократное (по отн. к размеру таблицы) либо двукратное место на диске для хранения индекса, а значит движок будет этот файл использовать со всеми вытекающими...
б) все равно новые записи не будут автоматически вставляться на ту же самую дисковую страницу соответственно ClusterID, а тупо дописываться в конец, что немного ухудшает результат;
3) Сделать партиционирование конкретных таблиц (не меняя СУБД). Но тут мне не все ясно. Например, как указать движку, на каком именно диске нужно хранить конкретную партицию? Без этого эффект партиционирования мне кажется неполноценным. Но зато есть огромный плюс: партиционирование делается офигенно просто :)

Переход на MSSQL и на Оракл не рассматриваю, т.к. перечисленные мной выше варианты представляются гораздо менее затратными и более эффективными.
...
Рейтинг: 0 / 0
28.11.2013, 11:51:28
    #38481411
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Kulavert,

У тебя комплексные проблемы, так с кондачка в форуме с ними не разберешься...
...
Рейтинг: 0 / 0
28.11.2013, 11:56:19
    #38481422
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Kulavert,

Погляди хотя бы на express редакции оракла и мс скуля.

Ну и PG, конечно.

MySQL конечно не лучшая в мире субд, но и с ней можно подрыгаться...
...
Рейтинг: 0 / 0
28.11.2013, 12:10:49
    #38481454
Kulavert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
MasterZivУ тебя комплексные проблемы, так с кондачка в форуме с ними не разберешься...
Поэтому стараюсь отвечать на уточняющие вопросы и предлагаю для оценки уже более-менее обдуманные варианты...
По описанным мной выше трем вариантам кто что может подсказать? В частности по партиционированию: можно ли как-то добиться, чтобы партиции были на разных дисках?
...
Рейтинг: 0 / 0
28.11.2013, 13:06:47
    #38481627
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
авторСделать партиционирование конкретных таблиц (не меняя СУБД). Но тут мне не все ясно. Например, как указать движку, на каком именно диске нужно хранить конкретную партицию? Без этого эффект партиционирования мне кажется неполноценным. Но зато есть огромный плюс: партиционирование делается офигенно просто :)
симлинк. но глубина анализа просто поражает. ты бы хоть конктерыне данные дал. железо, диски, характеристику базы.
...
Рейтинг: 0 / 0
28.11.2013, 13:20:07
    #38481660
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
KulavertОперативки выделено 32ГбА MySQL-то настроен, чтобы эффективно их использовать?
...
Рейтинг: 0 / 0
28.11.2013, 15:19:48
    #38481912
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
KulavertMasterZivУ тебя комплексные проблемы, так с кондачка в форуме с ними не разберешься...
Поэтому стараюсь отвечать на уточняющие вопросы и предлагаю для оценки уже более-менее обдуманные варианты...
По описанным мной выше трем вариантам кто что может подсказать? В частности по партиционированию: можно ли как-то добиться, чтобы партиции были на разных дисках?

Для начала скажи, какой у тебя движок таблиц.
...
Рейтинг: 0 / 0
28.11.2013, 15:26:48
    #38481929
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
MasterZiv,

15203263
...
Рейтинг: 0 / 0
28.11.2013, 15:32:45
    #38481941
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
KulavertmiksoftРеально ли в запросе нужны все поля таблицы?
Да.Можно сделать фильтрующий подзапрос, возвращающий PK, и связать с ним всю таблицу по JOIN. В этом случае в покрывающем индексе будут только поля, необходимые для фильтрации записей, а в итоговый результат попадут все поля исходной таблицы.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]