powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
33 сообщений из 33, показаны все 2 страниц
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #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
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38480775
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
движок таблицы какой?
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38480779
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реально ли в запросе нужны все поля таблицы?
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38480848
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНасколько я знаю, нет возможности сделать кластерный индекс по не уникальному полю ни в MySQL, ни в других старых добрых SQL
чего? где вы такое прочитали?
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38480864
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
партиционирование сделайте.
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38480869
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kulavertзаписи с одним значением ClusterID разбросаны по всем страницам таблицы, поэтому SELECT * ... WHERE ClusterID=1097 вызывает много чтений с диска.Это сколько ж на сервере оперативы, какой же объём таблиц и сколько записей тащится таким запросом? По уму - надо делать так, чтобы такие разрозненные таблицы кэшировались полностью или около того - пусьт даже ценой деления таблицы на две части со связью 1:1. Можно ещё сопроводить процесс партиционированием - тоже способствует.
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38480998
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kulavert,

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

15203263
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38481941
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KulavertmiksoftРеально ли в запросе нужны все поля таблицы?
Да.Можно сделать фильтрующий подзапрос, возвращающий PK, и связать с ним всю таблицу по JOIN. В этом случае в покрывающем индексе будут только поля, необходимые для фильтрации записей, а в итоговый результат попадут все поля исходной таблицы.
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38481943
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНапример, как указать движку, на каком именно диске нужно хранить конкретную партицию
http://dev.mysql.com/doc/refman/5.6/en/tablespace-placing.html
Код: sql
1.
2.
mysql> create table external (x int unsigned not null primary key) data directory = '/volumes/external1/data';
Query OK, 0 rows affected (0.03 sec)
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38482099
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё комментарии.

Я не думаю, что партицирование и разнесение данных по разным физическим девайсам сильно поможет.

Потому что -- ещё раз -- оба снижают сложность задачи не на порядки.
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38483297
Kulavert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrowсимлинк. но глубина анализа просто поражает. ты бы хоть конктерыне данные дал. железо, диски, характеристику базы.
За симлинк спасибо. Дал предложения DBA, думают...
Про железо: СУБД размещена в дата-центре, там свои ДБА, вроде толковые ребята и не по..исты, плюс они связываются с техподдержкой вендора оборудования. А что там у них за железо, я не спрашиваю, но уверен, что не 10-летней давности.
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38483307
Kulavert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Можно сделать фильтрующий подзапрос, возвращающий PK, и связать с ним всю таблицу по JOIN. В этом случае в покрывающем индексе будут только поля, необходимые для фильтрации записей, а в итоговый результат попадут все поля исходной таблицы. эмммм... недогнал...
Предположим, у меня для фильтрации записей только одно условие: ClusterID=XXXX. Можете пояснить свое предложение на примере?
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38483342
Kulavert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivЯ не думаю, что партицирование и разнесение данных по разным физическим девайсам сильно поможет.
Потому что -- ещё раз -- оба снижают сложность задачи не на порядки.
Тут можно сказать даже более конкретно: партиционирование снизит нагрузку на диск в 2, в 3, в 4 и т.д. раз (не ровно, конечно, а чуть меньше), в зависимости от того, как удастся договориться с админами дата-центра.
А для искоренения проблемы будем искать другое решение.
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38483704
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТут можно сказать даже более конкретно: партиционирование снизит нагрузку на диск в 2, в 3, в 4 и т.д. раз
глубина анализа не перестаёт поражать
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38484001
Kulavert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrowглубина анализа не перестаёт поражать
Могу дать адресок, где я беру эту дрянь
...
Рейтинг: 0 / 0
Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
    #38484135
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KulavertCygapb-007Можно сделать фильтрующий подзапрос, возвращающий PK, и связать с ним всю таблицу по JOIN. В этом случае в покрывающем индексе будут только поля, необходимые для фильтрации записей, а в итоговый результат попадут все поля исходной таблицы. эмммм... недогнал...
Предположим, у меня для фильтрации записей только одно условие: ClusterID=XXXX. Можете пояснить свое предложение на примере?не, сорь, это я фигню сморозил((

Если нужны все поля, то для минимизации запросов нужен псевдокластерный индекс, содержащий все эти нужные поля. Тогда вместо считывания строк из разных страниц можно было бы считать те же данные из небольшой непрерывной области индекса. Но размер таблицы удвоится, плюс ограничение на длину индекса, плюс затраты на обновления данных...

А то, что я предложил, не снимет KeyLookup для получения недостающих данных.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация чтения: возможен ли кластерный индекс на не уникальном поле или другое решение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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