Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Alter table t order by id, type / 25 сообщений из 34, страница 1 из 2
19.10.2015, 01:21:17
    #39079590
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
Существует ли какой-нибудь смысл в альтерации InnoDB таблиц в которых хранятся товары, у которых есть группы, а сами товары разбросаны абы как, но 83% запросов приходятся именно на выборку товаров из какой-то заданной группы (тега)? Или наличие индекса по полю группы - это достаточное ускорение, чтобы отжать из таблицы все, на что она способна по скорости?
...
Рейтинг: 0 / 0
19.10.2015, 06:52:28
    #39079617
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
Lumixable t order by id, type


https://dev.mysql.com/doc/refman/5.1/en/alter-table.html

ORDER BY does not make sense for InnoDB tables because InnoDB always orders table rows according to the clustered index.
...
Рейтинг: 0 / 0
19.10.2015, 09:49:53
    #39079758
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
LumixИли наличие индекса по полю группы - это достаточное ускорение, чтобы отжать из таблицы все, на что она способна по скорости?Если вопрос стоит "отжать все и любой ценой" на чтение, то можно использовать покрывающие индексы.
...
Рейтинг: 0 / 0
19.10.2015, 12:30:07
    #39079958
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
miksoftиспользовать покрывающие индексы.

javajdbcto the clustered index.


Это один и тот же зверь clustererd/покрывающий индекс?
И если да, то чем они отличаются от обычных индексов?
...
Рейтинг: 0 / 0
19.10.2015, 12:37:48
    #39079966
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
Lumixmiksoftиспользовать покрывающие индексы.javajdbcto the clustered index. Это один и тот же зверь clustererd/покрывающий индекс?
И если да, то чем они отличаются от обычных индексов?Нет, это не одно и то же.

clustererd индекс - в InnoDB это способ хранения данных в таблице. Фактически это индекс первичного ключа в котором "довеском" к каждой записи хранятся все остальные поля таблицы.

Покрывающий индекс не привязан к конкретному движку, но логически привязан к конкретному запросу или их семейству. Суть его в том, что в нем хранятся все поля таблицы, которые нужны для выполнения этих конкретных запросов. Разумеется первые по порядку поля должны быть те, которые нужны для отбора (и иногда сортировки) записей. С точки зрения СУБД это обычный индекс.
...
Рейтинг: 0 / 0
19.10.2015, 13:41:11
    #39080046
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
блин, пока разбирался, такая мешанина терминов!!
column index - синоним для index
clustered index - синоним для primary key, как бы самый главный дефолтный "secondary index", только на всю таблицу сразу
covering index - покрывающий индекс, то есть индекс, все поля которого есть в запросе
secondary index - копия таблицы для небольшого подмножества колонок, перечисленных в списке индекса, разновидность покрывающего индекса
multiple-column index - индекс с несколькими колонками (разновидность покрывающего индекса)
- composite index - синоним для multiple-column index
- combined index - синоним для multiple-column index
- compound index - синоним для multiple-column index

*

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

авторIn the Oracle Database product, this type of table is known as an index-organized table.

И получается, что любая innoDB - это уже изначально сортированная таблица, поэтому вместо того, чтобы делать по ней alter ... order by достаточно просто правильно составить составной примарный ключ и он будет и покрывающим и таблицу внутри себя будет хранить в отсортированном виде
...
Рейтинг: 0 / 0
19.10.2015, 14:05:10
    #39080085
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
LumixИ получается, что любая innoDB - это уже изначально сортированная по ПК таблица, поэтому вместо того, чтобы делать по ней alter ... order by достаточно просто правильно составить составной примарный ключ и он будет и покрывающим и таблицу записи с нужными колонками внутри себя будет хранить в отсортированном виде


... поп равел ... покрываюший ключ для конкретных запросов
не связан с ПК ключом, который определяется обшим дезайном.
...
Рейтинг: 0 / 0
19.10.2015, 14:05:54
    #39080086
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
Lumix clustered index - синоним для primary keyТолько для InnoDB, но не для MyISAM.
Lumix covering index - покрывающий индекс, то есть индекс, все поля которого есть в запросеНаоборот, все поля запроса есть в индексе. Если в индексе будут "лишние" поля, то он не перестанет от этого быть покрывающим.

Lumix secondary index - копия таблицы для небольшого подмножества колонок, перечисленных в списке индекса, разновидность покрывающего индексаНе "разновидность". Покрывающие индексы обычно являются вторичными индексами, но далеко не всегда вторичные индексы являются покрывающими.
Lumix multiple-column index - индекс с несколькими колонками (разновидность покрывающего индекса)Аналогично - индексы с несколькими колонками далеко не всегда являются покрывающими.

Т.е. формально покрывающий индекс может быть из одного поля и совпадать с первичным ключом. Т.е. он не будет ни secondary, ни multiple-column. Это редко, но бывает.
Lumixпримарный ключ и он будет и покрывающим и таблицу внутри себя будет хранить в отсортированном видеНе совсем так. Чтобы индекс был "правильным" покрывающим (а "неправильные" и не нужны) нужно еще и чтобы его начальные поля способствовали ускорению запроса.
...
Рейтинг: 0 / 0
19.10.2015, 15:05:03
    #39080195
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
LumixИ получается, что любая innoDB - это уже изначально сортированная таблица, поэтому вместо того, чтобы делать по ней alter ... order by достаточно просто правильно составить составной примарный ключ и он будет и покрывающим и таблицу внутри себя будет хранить в отсортированном виде

Да.
Только не думай, что тебе можно убирать из запроса ORDER BY...
...
Рейтинг: 0 / 0
19.10.2015, 20:18:06
    #39080615
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
miksoftLumix clustered index - синоним для primary keyТолько для InnoDB, но не для MyISAM.

Правильно ли я понимаю, что создаваая на myisam ключ alter t add clustered key pageId мы тем самым как бы вручную превращаем myisam в innodb. То есть официально, "на бумаге" она остается myisam, а по факту фигачит как innodb. Верный ход мысли и понимания?


miksoftLumix covering index - покрывающий индекс, то есть индекс, все поля которого есть в запросеНаоборот, все поля запроса есть в индексе. Если в индексе будут "лишние" поля, то он не перестанет от этого быть покрывающим.

Правильно ли понимаю, что покрывающий - это когда ВООБЩЕ не происходит обращения таблице, а выборка идет исключительно через индекс?

Вопрос: это чисто бюрокаратическое/академическое замечание или индекс действительно перестает быть покрывающим?

Код: sql
1.
2.
3.
4.
5.
6.
alter table t add index (a, b);
/** вариант А1. покрывающий, все ок*/
select a, b from t;

/** вариант А2. неужели он перестает быть покрывающим?*/
select a, b, с from t;



Есть ли в данном смысле в целях использования покрывающего индекса все не входящие в индекс поля кидать в джоин?

Код: sql
1.
select a, b from t natural join (select c from t) x



miksoftLumix secondary index - копия таблицы для небольшого подмножества колонок, перечисленных в списке индекса, разновидность покрывающего индексаНе "разновидность". Покрывающие индексы обычно являются вторичными индексами, но далеко не всегда вторичные индексы являются покрывающими.

Ок, этот момент ясен.
Вопрос: Можно ли примарный ключ, кинутый на id, считать покрывающим для всех запросов типа таких? Правда ли, что в этом случае чтения таблицы не происходит, а результаты забираются только из индекса?

Код: sql
1.
select id from t where id > 5;




miksoftЧтобы индекс был "правильным" покрывающим (а "неправильные" и не нужны) нужно еще и чтобы его начальные поля способствовали ускорению запроса.

Прошу уточнить что имеется ввиду под этой туманной и загадочной формулировкой "способствовали ускорению".
Или может вы имеете ввиду банальные ситуации когда индексы бесполезны для like '%some' случаев?
...
Рейтинг: 0 / 0
19.10.2015, 21:44:59
    #39080678
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
Lumix
Правильно ли я понимаю, что создаваая на myisam ключ alter t add clustered key pageId мы тем самым как бы вручную превращаем myisam в innodb. То есть официально, "на бумаге" она остается myisam, а по факту фигачит как innodb. Верный ход мысли и понимания?


Нет, он скорее всего просто проигнорирует фразу clustered, и создаст обычный индекс.



Правильно ли понимаю, что покрывающий - это когда ВООБЩЕ не происходит обращения таблице, а выборка идет исключительно через индекс?

Да. Но "вообще не происходит" тут надо понимать достаточно условно -- индекс логически всё же часть таблицы.



Вопрос: это чисто бюрокаратическое/академическое замечание или индекс действительно перестает быть покрывающим?
/** вариант А2. неужели он перестает быть покрывающим?*/
select a, b, с from t;


Да, перестаёт быть покрывающим для этого (второго) запроса. Для первого остаётся.



Есть ли в данном смысле в целях использования покрывающего индекса все не входящие в индекс поля кидать в джоин?
select a, b from t natural join (select c from t) x


Нет, нет смысла.



Вопрос: Можно ли примарный ключ, кинутый на id, считать покрывающим для всех запросов типа таких? Правда ли, что в этом случае чтения таблицы не происходит, а результаты забираются только из индекса?
select id from t where id > 5;


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



miksoft
Чтобы индекс был "правильным" покрывающим (а "неправильные" и не нужны) нужно еще и чтобы его начальные поля способствовали ускорению запроса.

Прошу уточнить что имеется ввиду под этой туманной и загадочной формулировкой "способствовали ускорению".
Или может вы имеете ввиду банальные ситуации когда индексы бесполезны для like '%some' случаев?


Имелось в виду тупо, что поля, добавляемые в индекс для "покрытия" запроса должны добавляться в него в конец, после полей, которые служат для ускорения выборки (WHERE).


Ну и ещё скажу, что я всегда говорю про покрывающие индексы -- это ни в коем случае не "ходовая" техника оптимизации запросов, её нельзя рассматривать как универсальную и применяемую во всех случаях. Даже нельзя рассматривать как часто применяемую и к применению которой надо стремиться. Причина проста: ты не можешь позволить себе бесконечно большое
число индексов на таблице. Если при оптимизации условий выборки число индексов стремится к количеству уникально применяемых
фильтров на таблицу, то при попытках делать покрывающие индексы число индексов на таблице будет равно в пределе
количеству уникальных фильтров умножить на количество уникальных сочетаний полей в списке вывода SELECT-а, т.е. почти
комбинаторно расти. Запросов на таблицу чаще всего тоже гораздо больше, чем условий выборки.
Именно поэтому нет смысла стремиться сделать покрывающий индекс, если случайно так совпало, что для запроса индекс оказался
покрывающим, то можно порадоваться, а специально добавлять в индекс поля, если они не участвуют в фильтрации неинтересно.
...
Рейтинг: 0 / 0
19.10.2015, 22:04:48
    #39080688
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
Lumixalter t add clustered key pageIdНет такого синтаксиса в MySQL.
И, кстати, в других СУБД этот термин может означать другое понятие.
...
Рейтинг: 0 / 0
19.10.2015, 22:10:56
    #39080690
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
LumixПравильно ли понимаю, что покрывающий - это когда ВООБЩЕ не происходит обращения таблице, а выборка идет исключительно через индекс?Да.

Пока подбирал подходящую цитату в доке, нашел любопытный момент:
http://dev.mysql.com/doc/refman/5.6/en/index-extensions.html Before MySQL 5.6.9, the optimizer does not take into account the primary key columns of the extended secondary index when determining how and whether to use that index. As of 5.6.9, the optimizer takes the primary key columns into account, which can result in more efficient query execution plans and better performance.
А нужная цитата вот:
http://dev.mysql.com/doc/refman/5.6/en/mysql-indexes.html In some cases, a query can be optimized to retrieve values without consulting the data rows. (An index that provides all the necessary results for a query is called a covering index.) If a query uses from a table only columns that are included in some index, the selected values can be retrieved from the index tree for greater speed:
...
Рейтинг: 0 / 0
19.10.2015, 22:13:54
    #39080691
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
MasterZiv, огромное спасибо за ответы!
У меня теперь очень качественно сейчас все устаканилось в голове по поводу индексов.
...
Рейтинг: 0 / 0
19.10.2015, 22:17:01
    #39080693
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
miksoftПока подбирал подходящую цитату в доке, нашел любопытный момент:
http://dev.mysql.com/doc/refman/5.6/en/index-extensions.html Before MySQL 5.6.9, the optimizer does not take into account the primary key columns of the extended secondary index when determining how and whether to use that index. As of 5.6.9, the optimizer takes the primary key columns into account, which can result in more efficient query execution plans and better performance.

Получается, что в наших базах данные которые пашут на 5.0.17 двигатель кладет болт на примарные индексы вообще что ли? То есть как бы получается, что нет смысла городить составной примарный индекс, а все равно придется делать отдельный вторичный составной индекс. В этом суть этого абзаца, да?
...
Рейтинг: 0 / 0
19.10.2015, 22:17:49
    #39080694
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
LumixmiksoftЧтобы индекс был "правильным" покрывающим (а "неправильные" и не нужны) нужно еще и чтобы его начальные поля способствовали ускорению запроса.Прошу уточнить что имеется ввиду под этой туманной и загадочной формулировкой "способствовали ускорению".
Или может вы имеете ввиду банальные ситуации когда индексы бесполезны для like '%some' случаев?Например, для запроса вида SELECT a,b FROM mytabel WHERE a=10 оба индекса (a,b) и (b,a) будут покрывающими. Но "правильным", т.е. дающим ускорение, будет только (a,b). Индекс (b,a) сможет быть использован только для его полного сканирования, но не для индексного доступа. Да и то, если только явно заставить оптимизатор сделать это.
...
Рейтинг: 0 / 0
19.10.2015, 22:22:55
    #39080697
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
LumixmiksoftПока подбирал подходящую цитату в доке, нашел любопытный момент:
пропущено...


Получается, что в наших базах данные которые пашут на 5.0.17 двигатель кладет болт на примарные индексы вообще что ли? То есть как бы получается, что нет смысла городить составной примарный индекс, а все равно придется делать отдельный вторичный составной индекс. В этом суть этого абзаца, да?Нет....
Это означает, что индекс (a,b) будет использоваться именно как индекс (a,b). А начиная с версии 5.6.9 он сможет использоваться как (a,b,id), где id - поля первичного ключа. Он же все равно содержит в качестве замыкающих эти поля первичного ключа. Но оптимизатор в старых версиях не умеет учитывать этот факт.
...
Рейтинг: 0 / 0
19.10.2015, 22:25:08
    #39080698
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
miksoftLumixпропущено...
Прошу уточнить что имеется ввиду под этой туманной и загадочной формулировкой "способствовали ускорению".
Или может вы имеете ввиду банальные ситуации когда индексы бесполезны для like '%some' случаев?Например, для запроса вида SELECT a,b FROM mytabel WHERE a=10 оба индекса (a,b) и (b,a) будут покрывающими. Но "правильным", т.е. дающим ускорение, будет только (a,b). Индекс (b,a) сможет быть использован только для его полного сканирования, но не для индексного доступа.

Ок, теперь вообще все по полочкам легло.

miksoftДа и то, если только явно заставить оптимизатор сделать это.

А чем мы можем форсить оптимизатор? Какие-то ключевые слова есть или модификаторы?
...
Рейтинг: 0 / 0
19.10.2015, 22:26:29
    #39080700
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
LumixmiksoftДа и то, если только явно заставить оптимизатор сделать это.

А чем мы можем форсить оптимизатор? Какие-то ключевые слова есть или модификаторы?Да, смотрите доку на SELECT.
...
Рейтинг: 0 / 0
20.10.2015, 05:27:50
    #39080775
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
Lumix,
в качестве информации http://habrahabr.ru/post/269121/
в конце ещё ссылки..
...
Рейтинг: 0 / 0
20.10.2015, 10:09:29
    #39080903
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
вадяLumix,
в качестве информации http://habrahabr.ru/post/269121/
в конце ещё ссылки..А причем тут эта статья?
Да и ссылок я там не вижу.
...
Рейтинг: 0 / 0
20.10.2015, 14:19:00
    #39081259
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
miksoftвадяLumix,
в качестве информации http://habrahabr.ru/post/269121/
в конце ещё ссылки..А причем тут эта статья?
Да и ссылок я там не вижу.
раздел - Похожие публикации
просто для информации для Lumix , он активно ищет инфу.
...
Рейтинг: 0 / 0
20.10.2015, 14:29:15
    #39081275
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
вадяраздел - Похожие публикацииА, понял. У меня на них баннерная слепота. Думал, что где-то в самой статье есть ссылки.
...
Рейтинг: 0 / 0
20.10.2015, 17:02:38
    #39081561
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
вадяmiksoftпропущено...
А причем тут эта статья?
Да и ссылок я там не вижу.
раздел - Похожие публикации
просто для информации для Lumix , он активно ищет инфу.

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

Вы все знаете, что тут на форуме есть очень активный чувак, который постоянно в качестве ответа на конкретный вопрос дает именно такие советы. Я на него вообще не реагирую и у меня сердце кровью обливается, когда я вижу как он своими советами "разводит" новичков.

У меня принцип такой: ссылка на статью должна углублять понимание вопроса, а не расширять его.

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

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

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

покажите что для понимания этой мысли мне реально потребовалось бы прочитать целую статью, а не один абзац

сообщите какая именно статья из раздела Похожие статьи имеет отношение к обсуждаемой теме

покажите что какая-то из этих статей реально требует полного прочтения для понимания, а не какого-то одного абзаца

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

Если вы не сможете выполнить эти пункты, то ваша рекомендация прочитать эту статью - это точно такая же рекомендация как:
Lumix, прочитайте все статьи на хабре с ключевым словом InnoDB.

Я игнорирую подобные советы, потому что подобные советы может давать любой человек, не будучи даже близко экспертом.
Я изучаю внешние ссылки только когда вижу, что эксперт сам проработал этот материал, выжал из него главную мысль по обсуждаемой теме и четко указал какой именно кусок в приведенной ссылке относится к обсуждаемой теме. В этом случае, мне становится понятно, что перейдя по ссылке я более глубоко изучу вопрос и не потеряю время из-за расширения области поиска, спровоцированного "rtfm-троллем".
...
Рейтинг: 0 / 0
20.10.2015, 17:12:16
    #39081575
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Alter table t order by id, type
Lumixдля изучения материалов, на которые мне дают ссылку может потребоваться 20 днейА Вы используйте индексный доступ, а не полное сканирование таблицы :)
Для этого существует оглавление, которое по сути есть индекс.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Alter table t order by id, type / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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