|
|
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Допустим у нас есть сложный запрос Код: sql 1. 2. 3. 4. Таблица 8,5 млн. записей. Результат этого запроса без лимита 87694 записи. На основе логов мы вдруг видим, что у нас в 18% случаев этих запросов комбинация a = 'someA' && c = 'someC' && f = 'someF' && u > someU повторяется, а другие параметры меняются. Чтобы ускорить этот вид запросов мы создаем фильтр-флаг fif_1 bool not null, index _fif_1 (fif_1) и в момент записи (сохранения, апдейта) в эту таблицу мы пишем результат логического выражения этого условия Код: sql 1. и теперь билдер sql-запросов, когда встречает эту комбинацию в запросе, то заменяет её на fif_1 = 1 вопрос: есть ли смысл в подобных заманухах или это все от лукавого? - - - Два вопроса в этом же контексте: вопрос 1.a существует ли реальный смысл вместо Код: sql 1. делать через вложенный запрос, чтобы исключить операции x = 'someX' на заведомо лишних записях Код: sql 1. 2. 3. 4. или само расположение fif_1 = 1 первым условием в where-секции уже дает такую гарантию? или может быть такие вещи мускул вообще сам умеет додумывать что лучше ставить первым, а что вторым??? вопрос 2.a есть ли смысл создавать Код: sql 1. и юзать его вместо вложенного запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2015, 20:12:01 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumix, 1. Вряд ли вы этим что-то выиграете. Разве что у этих 18 % крайне сверхостро стоит проблема времени выполнения, пусть и с ущербом для всего остального. А так вы получаете дополнительный индекс, который тоже нужно уместить в буферный кэш. Если кэша не хватает, то остальные объекты будут чаще из него вымываться, что нехорошо. 1.а Нет, смысла нет. Такие вещи решаются правильным порядком полей в индексе. 2.а Нет, смысла тем более нет. Добавляется опасность материализации view. Кроме того, не уверен, что индекс подхватится, если часть предикатов будет во view, а другая часть в самом запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2015, 20:41:11 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
miksoft, огромное спасибо за все три ответа!! вот эту фразу только не понял... miksoftТакие вещи решаются правильным порядком полей в индексе. правильный порядок полей в индексе???? индекс - это что-то, содержащее порядок полей???.... я думал индекс - это такая шняга, которая вешается на каждое поле отдельно для ускорения поиска... или есть ещё какие-то индексы, которые сразу по нескольким полям формируются что ли??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2015, 21:10:01 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumixи теперь билдер sql-запросов, когда встречает эту комбинацию в запросе, то заменяет её на fif_1 = 1 это вам кто сказал? Если бы вы сделали вычисляемое поле, - то да, у оптимизатора была бы возможность свернуть 4 проверки разных полей в проверку одного вычисляемого поля, да и то не факт что на это хватило бы времени. Но в MySQL вычисляемых полей нет, поэтому замену 4х проверок на одну вам придется делать самостоятельно. Насколько я понял, вы хотите как раз автоматизации замены - тогда ответ "нет". По той части вопроса, в которой вы хотите комбинировать условия фильтра - оптимизатор строит план выполнения запроса на основе кучи статистических данных о содержимом таблиц, и вполне может не согласиться с заявленным в запросе порядком обработки, посчитав его более затратным по ресурсам, и выполнив "свой" вариант обработки. Именно поэтому SQL является деклартивным, а не операционным языком: в запросе указывается, что требуется сделать. Как сделать затребованное оптимальным с точки зрения ресурсов сервера способом - определяет сама СУБД. Это же справедливо и при использовании VIEW: определение VIEW подставляется в соответствующее место запроса, и уже после этого производится построение оптимального плана выполнения "развернутого" запроса (да еще и время на построение плана ограничено). Конечно, понимая механизм формирования плана выполнения, можно попытаться помочь серверу, например, создавая дополнительные индексы по одному или нескольким полям, - но даже при их наличии оптимизатор может, например, посчитать, что при хранящихся сейчас в таблице данных стоимость полного перебора таблицы будет дешевле поиска в индексе, и отказаться от использования индекса при обработке запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2015, 22:24:31 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Cygapb-007поэтому замену 4х проверок на одну вам придется делать самостоятельно. Насколько я понял, вы хотите как раз автоматизации замены - тогда ответ "нет". ложная тревога все юнитам вернуться в места постоянной дислокации))) речь идет об sql-билдере на клиенте сам сервак получает уже либо, либо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2015, 22:28:36 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumixправильный порядок полей в индексе???? индекс - это что-то, содержащее порядок полей???.... я думал индекс - это такая шняга, которая вешается на каждое поле отдельно для ускорения поиска... или есть ещё какие-то индексы, которые сразу по нескольким полям формируются что ли???В индексе может быть много полей. И даже в одноколоночном индексе по факту, как минимум, два поля - проиндексированное поле и поле/поля первичного ключа (в случае InnoDB). В своих ответах я полагал, что правильные многоколоночные индексы уже созданы и сравнение идет с ними. Если же нет, то, имхо, стоит заняться именно этим. См. Optimization and Indexes ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2015, 23:01:20 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
miksoftВ своих ответах я полагал, что правильные многоколоночные индексы уже созданы и сравнение идет с ними. Если же нет, то, имхо, стоит заняться именно этим. См. Optimization and Indexes Я посмотрел и немного запутался... Сначала я прочитал статью Multiple-Column Indexes http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html и подумал - о! уау, это круть... но затем на stackoverflow оказалось, что индексы и ключи - это одно и то же http://stackoverflow.com/questions/1401572/what-are-differences-between-index-v-s-key-in-mysql но блин, я вроде как всю жизнь думал, что мультиколоночный индекс - это такая шняга, которая контроллирует уникальность комбинации и запрещает несколько записей с этой комбинацией например Код: sql 1. и тогда в этой таблице может быть только одна запись с данными ('mercedes', 'coupe') и тем самым, если будет насколько моделей мерседеса купе, то этот индекс просто не даст создать вторую и последующую запись... может я что-то не так понял, про многоколоночные индексы?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2015, 23:16:23 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
LumixCygapb-007поэтому замену 4х проверок на одну вам придется делать самостоятельно. Насколько я понял, вы хотите как раз автоматизации замены - тогда ответ "нет". ложная тревога все юнитам вернуться в места постоянной дислокации))) речь идет об sql-билдере на клиенте сам сервак получает уже либо, либоСнимите уже мигалку с головы, больше на человека будете похожи. Как раз самостоятельно вы замену и делаете - ну и на здоровье. По 1.а - если индекс по Х более селективен, его логичнее использовать раньше отбора по fif_1, но селективность может ухудшаться (или улучшаться) при увеличении числа строк. Именно об этом основная часть моего ответа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2015, 23:17:31 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Cygapb-007Lumix, Посмотрите Определяем порядок столбцов в составном индексе Статья, прикольная! Единственное, я не понял, индекс по (status,tries) как предлагает сделать автор вводит обязательность на уникальность этих пар или даже после установления этого индекса разрешается создавать любое количество записей с комбинацией (source = 'twitter', tries = 20)??? PS. прежде, чем отправить этот вопрос я подумал, что проще наверное создать таблицу и проверить самому... создал, проверил, разрешает... подумал, как так??? и тут я понял: miksoft пишет, что где-то в глубине каждый индекс уже содержит примарный кей, поэтому в таблице (id, a, b) создавая index i (a, b) мы по сути ВСЕГДА создаем индекс index i (id, a, b), а поскольку id всегда уникален, поэтому и можно создавать сколько угодно записей, где будет повторяться комбинация (a, b)... круто... только я теперь не совсем въехал, а как тогда объявить ключ, если я хочу реально поставить ограничение, чтобы в таблице всегда (a, b) была уникальной комбинацией и две записи с одинаковыми полями (a, b) создавать было бы невозможно???? а так круто, круто... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 00:04:22 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, функция select sum(условие) from t - РЕАЛЬНО КРУТАЯ ШТУКА!!! я так рад, что создал эту тему не было бы этой темы, не узнал бы про такую нереально крутую приблудину!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 00:07:08 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, select sum(условие) / count(*) from t - это супер-мега-офигительный способ определения стоит создавать индекс по полю или нет!! чем ближе это значение к 100%, тем меньше смысла в создании индекса. Просто реально крутой способ!! В свете новой информации сейчас ищу инфу по двум вопросам: 1) когда мультиколоночный индекс выгоднее двух индексов по обоим колонкам 2) какой размер лучше всего задавать мультиколоночному индексу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 00:18:40 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
разобрался с уникальностью: key (a, b) - создает индекс и эта комбинация может повторяться сколько угодно раз unqiue key (a, b) - создает индекс, где эта комбинация становится уникальным ключом все просто и прекрасно!!)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 00:20:15 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumix2) какой размер лучше всего задавать мультиколоночному индексу ха-ха-ха http://www.sql.ru/forum/1020884/v-chem-raznica-dliny-indeksa видимо для мультиколоночных работают те же самые принципы, просто тут сразу несколько колонок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 00:25:51 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumix1) когда мультиколоночный индекс выгоднее двух индексов по обоим колонкам пишут, что мускул в одном селекте может юзать только один индекс, именно поэтому, чтобы задействовать сразу несколько индексов и создаются многоколоночные индексы единственное я сейчас пока не нашел ответа, считаются ли селект в селекте одним селектом или внутренний селект считается самостоятельным селектом и поэтому через вложенные селекты можно замутить в одном селекте использование двух индексов типа так Код: sql 1. 2. Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 00:33:21 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumixчто мускул в одном селекте может юзать только один индексПо одному для каждого табличного алиаса. Из этого правила уже есть исключение, в ряде случаев он научился делать INDEX MERGE для случаев WHERE field1=100 OR field2=234, правда, не помню, начиная с какой версии. Первые попавшиеся ссылки на тему: http://dev.mysql.com/doc/refman/5.5/en/index-merge-optimization.html http://stackoverflow.com/questions/29054816/mysql-merge-index-optimization-not-working http://jorgenloland.blogspot.co.uk/2012/10/index-merge-annoyances-fixed-in-mysql-56.html Lumixименно поэтому, чтобы задействовать сразу несколько индексов и создаются многоколоночные индексыНет, не поэтому. Даже в тех случаях, когда теоретически возможно объединить индексы для отдельных колонок, использование одного готового многоколоночного индекса будет заметно быстрее (при условии, что его применение в принципе возможно для конкретного запроса). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 01:04:47 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
miksoft, а я почему-то думал, что пересечение индексов работает только для AND, типа есть intersect - и хватит... А в доку лезть поленился :) Спасибо:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 02:04:40 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumixединственное я сейчас пока не нашел ответа, считаются ли селект в селекте одним селектом или внутренний селект считается самостоятельным селектом и поэтому через вложенные селекты можно замутить в одном селекте использование двух индексов Как мне представляется, на первом этапе компиляции запрос раскладывается на кирпичики элементарных действий, а затем, на втором этапе, оптимизатор, используя свой набор правил оптимизации, начинает корежить черновой план выполнения с учетом накопленной на момент оптимизации запроса статистики по индексам и значениям полей таблиц из запроса, добиваясь минимальной ожидаемой стоимости выполнения за отведенное на компиляцию запроса время. И сформированный в итоге план выполнения может значительно отличаться от ожидаемого при написании запроса. А может и совпадать, если статистика соответствует ожиданиям:) Это я к тому, что предоставьте оптимизатору возможность выбора, добавив всевозможные индексы на этапе тестирования (самый простой, универсальный, но и самый медленный план, который можно выбрать практически всегда, - последовательное чтение всех строк таблицы в порядке извлечения их из хранилища). Но и не забывайте, что чем больше индексов - тем больше места требуется на диске и тем дольше изменения таблицы (все индексы нужно перестроить при каждом INSERT/DELETE, а некоторые и при UPDATE). Предоставив всевозможные индексы, можно оценить поведение оптимизатора, разрешая или запрещая некоторые из созданных индексов через index_hint При увеличении числа строк, а соответственно при изменении селективности созданных и возможных индексов, может появиться более оптимальный вариант выполнения запроса. Хотя насчет оптимизатора MySQL - могу только предполагать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 07:52:44 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumixно блин, я вроде как всю жизнь думал, что мультиколоночный индекс - это такая шняга, которая контроллирует уникальность комбинации и запрещает несколько записей с этой комбинациейДумать - это, конечно, похвально... но документацию, *****, кто читать за вас будет?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 12:07:40 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
tanglirLumixно блин, я вроде как всю жизнь думал, что мультиколоночный индекс - это такая шняга, которая контроллирует уникальность комбинации и запрещает несколько записей с этой комбинациейДумать - это, конечно, похвально... но документацию, *****, кто читать за вас будет?! начинающие и прочие школьники читая ваше возмущение могут подумать: о боже, наверное, Lumix, это такая ленивая скотина, что даже лень открыть доку...))) на самом деле, существует такой эффект (если не верите, можете проверить на себе) читаем доку полностью начинаем читать заново и удивляемся как много мы могли пропустить мимо внимания заканчиваем читать второй раз и начинаем читать третий и опять охреневаем, а это-то как мы могли пропустить мимо внимания??... заканчиваем читать в третий раз начинаем читать в четвертый и снова найдя новые удивительные открытия вдруг понимаем, что сколько бы раз мы ни читали доку, все равно в ней останутся ВАЖНЫЕ места, которые мы пропустили мимо внимания вывод: век живи, век учись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 12:43:33 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumixна самом деле, существует такой эффектДа кто ж спорит, он существует. Но путать многоколоночные индексы с уникальными? Lumixсколько бы раз мы ни читали доку, все равно в ней останутся ВАЖНЫЕ места, которые мы пропустили мимо вниманияЧто и КАК для этого надо было пропустить в доке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 13:27:59 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
пора уже переходить к практике... 1. установите MySQL локально для практики (в FAQ-е установка за 10 шагов...) 2. создайте таблицу для анализа использования индексов (допустим example с полями (id,) p1,p2,p3,p4,p5) 3. заполните данными 1-2 млн записей (лучше больше) 4. Создайте индексы как по каждому полю отдельно, так и составные допустим IDX123(p1,p2,p3) IDX12345(p1,p2,p3,p4,p5) 5. выполняя запросы с различными условиями, сделайте выводы. для понимания выполнения запроса используйте "ПЛАН запроса", для этого перед SELECT добавьте "EXPLAIN" в столбце "possible_key" увидите возможные для использования индексы, в графе "key" - используемый индекс Lumixединственное я сейчас пока не нашел ответа, считаются ли селект в селекте одним селектом или внутренний селект считается самостоятельным селектом и поэтому через вложенные селекты можно замутить в одном селекте использование двух индексовпростой запрос в "базе для практике" (обзовем коротко БДП) Код: sql 1. "свернется" из вложенного в один с использованием составного индекса IDX12345 Ну и так далее по шажочкам можно употреблять док-ю к практике... Далее, произойдет осознание прочитанного: - если у вас наиболее встречаемые параметры p1,p2,p3, в запросах то возможно выгоднее будет держать индекc IDX123 чем IDX12345 - одиночное WHERE p2="some2" будет прекрасно использовать IDX123 если нет отдельно IDX2(p2) - и т.д. в итоге оптимизатор выберет сам необходимый путь, вы лишь можете ему "помочь" PS чтение правил дорожного движение не учит вождению автомобиля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 13:47:55 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
miksoft И даже в одноколоночном индексе по факту, как минимум, два поля - проиндексированное поле и поле/поля первичного ключа (в случае InnoDB). На самом деле 3, а не 2 -- в конце ещё идёт версия записи. InnoDB же версионник... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 18:48:45 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
tanglirНо путать многоколоночные индексы с уникальными? Lumixсколько бы раз мы ни читали доку, все равно в ней останутся ВАЖНЫЕ места, которые мы пропустили мимо вниманияЧто и КАК для этого надо было пропустить в доке? Тут действует принцип постепенного стирания информации из памяти, если ей не пользоваться постоянно. Самый популярный пример - это словарный запас английского языка. Как бы круто кто не владел языком, если им не пользоваться регулярно, то словарный запас стирается. Вот у меня с mysql и многими другими вещами так же. Когда-то я очень хорошо многие вещи знал, но поскольку я не пользуюсь такими глубокими вещами каждый божий день, то естественно постепенно многие ньансы стираются. Точно так же как и с английским языком. Когда-то я владел им в совершенстве на уровне upper intermediate, но сегодня на этот уровень без подготовки я не сдам, хотя свободно общаюсь на английском, когда мне это потребуется. Точно так же и с мускулом. Я им более-менее свободно владею, но вот на upper-intermediate по мускулю не сдам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 18:51:09 |
|
||
|
флаги как фильтр-кеши
|
|||
|---|---|---|---|
|
#18+
Lumix вывод: век живи, век учись Ты переведи вопрос в практическое русло. Во-первых, вместо Код: plaintext 1. надо писать Код: plaintext 1. Далее, на Код: plaintext 1. 2. создаём индеск (a, c, f, u) (именно в таком порядке! Хотя тут можно менять местами a,c,f произвольно, но u должно быть в конце)-- и не нужно поле fif. На частые условия помимо данного тоже можно создать индексы, которые включают сначала это условие, а затем другие. Но каждый случай набора условий нужно рассматривать отдельно. Ты можешь выявить частоту сложных запросов, и начать по ним идти и оптимизировать. Для этого есть --slow-query-log ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2015, 18:55:56 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39059927&tid=1832693]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 332ms |

| 0 / 0 |
