После определения индекса MySQL выполнит оставшуюся часть работы? [Дубликат]

`У меня была такая же проблема, и она была решена с помощью:

1) Sync Project with gradle files
2) Build -> Clean Project
3) Build -> Rebuild Project
4) File -> Invalidate caches

//imp step
5) Check your xml files properly.`
333
задан 6 revs, 4 users 43% 27 April 2017 в 07:54
поделиться

6 ответов

В основном индекс в таблице работает как индекс в книге (откуда и произошло название):

Предположим, у вас есть книга о базах данных, и вы хотите найти некоторую информацию о, скажем, , место хранения. Без индекса (без дополнительной помощи, например оглавления) вам придется проходить страницы один за другим, пока не найдете тему (это full table scan). С другой стороны, индекс имеет список ключевых слов, поэтому вы обратитесь к индексу и увидите, что storage упоминается на страницах 113-120, 231 и 354. Затем вы можете переходить на эти страницы напрямую, без поиска (это поиск с индексом, несколько быстрее).

Конечно, насколько полезен индекс, зависит от многих вещей - несколько примеров, используя сравнение выше:

  • если у вас есть книга по базам данных и проиндексирована слово «база данных», вы увидите, что она упоминается на страницах 1-59,61-290 и 292-400. В этом случае индекс не очень помогает, и это может (в базе данных это «низкая избирательность»).
  • Для 10-страничной книги нет смысла делать индекс, так как вы можете закончить [10]
  • Индекс также должен быть полезен - в общем, нет смысла делать это с помощью 10-страничной книги, предваряемой 5-страничным индексом, что просто глупо - просто сканировать 10 страниц. индексировать, например частота буквы «L» на странице.
429
ответ дан Piskvor 18 August 2018 в 04:30
поделиться

Возьмите в видео для получения дополнительной информации об индексировании

Простая индексация Вы можете создать уникальный индекс в таблице. Уникальный индекс означает, что две строки не могут иметь одинаковое значение индекса. Вот синтаксис создания индекса в таблице

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...);

Вы можете использовать один или несколько столбцов для создания индекса. Например, мы можем создать индекс на tutorials_tbl с помощью tutorial_author.

CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author)

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

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

mysql> CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author DESC)
2
ответ дан 2 revs, 2 users 72% 18 August 2018 в 04:30
поделиться

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

Существуют различные типы индексов, и они реализованы на уровне хранилища, поэтому между ними нет стандарта, и они также зависят от используемого механизма хранения.

InnoDB и индекс B + Tree

Для InnoDB наиболее распространенным типом индекса является индекс B + Tree, который хранит элементы в отсортированном порядке. Кроме того, вам не нужно обращаться к реальной таблице, чтобы получить индексированные значения, что ускоряет ваш запрос.

«Проблема» в этом типе индекса заключается в том, что вам нужно запросить самую левую значение для использования индекса. Итак, если ваш индекс имеет два столбца, скажем last_name и first_name, порядок, который вы запрашиваете для этих полей, имеет большое значение.

Итак, учитывая следующую таблицу:

CREATE TABLE person (
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    INDEX (last_name, first_name)
);

запрос использовал бы индекс:

SELECT last_name, first_name FROM person
WHERE last_name = "John" AND first_name LIKE "J%"

Но следующий не будет

SELECT last_name, first_name FROM person WHERE first_name = "Constantine"

Поскольку вы сначала запрашиваете столбец first_name, и это не самый левый столбец в индексе.

Этот последний пример еще хуже:

SELECT last_name, first_name FROM person WHERE first_name LIKE "%Constantine"

Так как теперь вы сравниваете правую часть самого правого поля в индексе.

Хэш-индекс

Это другой тип индекса, который, к сожалению, поддерживает только память. Это очень быстро, но полезно только для полного поиска, а это значит, что вы не можете использовать его для операций, таких как >, < или LIKE.

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

Если у вас есть большое поле VARCHAR, вы можете «эмулировать» использование хеш-индекса при использовании B-Tree, создав другой столбец и сохранив хэш большого значения на нем. Предположим, вы храните URL-адрес в поле, и значения довольно велики. Вы также можете создать целое поле с именем url_hash и использовать хеш-функцию, такую ​​как CRC32 или любую другую хеш-функцию, чтобы хэшировать URL-адрес при его вставке. И затем, когда вам нужно запросить это значение, вы можете сделать что-то вроде этого:

SELECT url FROM url_table WHERE url_hash=CRC32("http://gnu.org");

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

SELECT url FROM url_table 
WHERE url_hash=CRC32("http://gnu.org") AND url="http://gnu.org";

По-прежнему стоит хэш-вещи, даже если число столкновений является большим, потому что вы будете выполнять только второе сравнение ( string).

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

Завершить

Некоторые факты, которые вы можете рассмотреть каждый раз, когда хотите поговорить об оптимизации:

  1. Целочисленное сравнение намного быстрее, чем сравнение строк. Это можно проиллюстрировать на примере эмуляции хэш-индекса в InnoDB.
  2. Возможно, добавление дополнительных шагов в процесс делает его быстрее, а не медленнее. Это можно проиллюстрировать тем фактом, что вы можете оптимизировать SELECT, разделив его на два шага, сделав первые значения хранилища во вновь созданной таблице в памяти, а затем выполните более тяжелые запросы в этой второй таблице.

У MySQL также есть и другие индексы, но я думаю, что B + Tree один из самых используемых когда-либо, а хэш - хорошая вещь, но вы можете найти другие в Документация по MySQL .

Я настоятельно рекомендую вам прочитать книгу «Высокая производительность MySQL», ответ выше определенно основывался на ее главе об индексах.

207
ответ дан 5 revs, 3 users 96% 18 August 2018 в 04:30
поделиться
  • 1
    Будут ли следующие запросы иметь преимущество в вышеприведенном случае? 1. SELECT last_name, first_name FROM person WHERE last_name= "Constantine" 2. SELECT last_name, first_name FROM person WHERE last_name LIKE "%Constantine" – Akshay Taru 30 November 2013 в 08:18
  • 2
    Первый querry будет, второй запрос не будет. Используйте EXPLAIN: dev.mysql.com/doc/refman/5.5/en/explain.html Для индексирования второго запроса в MySQL вам нужно использовать FULLTEXT INDEX: dev.mysql.com/ док / RefMan / 5,5 / ен / полнотекстового-search.html – Emilio Nicolás 29 May 2014 в 12:30
  • 3
    Я поддержал вас, потому что вы были в 127, а ответ №1 был в 256. Я не мог избежать того, чтобы все было красиво и чисто, двоично. – pbarney 11 October 2016 в 19:01
  • 4
    Это была новая информация для меня ", так что вы запрашиваете эти поля. Благодарю. – Khatri 3 November 2016 в 07:12
  • 5
    Мне нравится этот ответ больше, чем принятый ответ. благодаря – Rahul Goyal 16 February 2017 в 14:19

Взгляните на эту ссылку: http://dev.mysql.com/doc/refman/5.0/ru/mysql-indexes.html

Как они работают слишком широк для объекта для покрытия в одном сообщении SO.

Здесь является одним из лучших объяснений индексов, которые я видел. К сожалению, это для SQL Server, а не для MySQL. Я не уверен, насколько похожи эти два ...

2
ответ дан Abe Miessler 18 August 2018 в 04:30
поделиться
  • 1
    Хорошая статья. Я не знаю SQL Server, но основные работы выглядят очень похожими. (метанот: отключение стилей CSS во второй связанной статье отображает содержимое) – Piskvor 25 August 2010 в 17:24

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

1: Идите в середину списка - выше или ниже того, что я ищу?

2: Если выше, перейдите к промежуточной точке между серединой и дном, если нижний, средний и верхний

3: выше или ниже? Переход к средней точке снова и т. Д.

Используя эту логику, вы можете найти элемент в отсортированном списке примерно за 7 шагов вместо проверки каждого элемента.

Очевидно, что существуют сложности , но это дает вам основную идею.

28
ответ дан Joshua 18 August 2018 в 04:30
поделиться
  • 1
    Это называется бинарным поиском. – ddlshack 11 June 2012 в 17:09
  • 2
    Спасибо, наконец, ответ, который объясняет, почему это происходит быстрее, а не только как функция db с индексами. – Gershon Herczeg 9 July 2013 в 17:27
  • 3
    Почему это 7 шагов? – Philip007 22 July 2013 в 07:44
  • 4
    Фактическое количество шагов сильно зависит от данных - количества уникальных значений и распределения в вашем диапазоне. 7 - теоретический максимум для 100 значений. Полное обсуждение того, как вычислить количество шагов здесь stackoverflow.com/questions/10571170/… – Joshua 14 May 2015 в 15:44
  • 5
    Наиболее распространенным индексом MySQL является дерево B +, которое работает аналогично двоичному поиску, но не совсем то же самое. Алгоритмическая сложность такая же, но способ ее поиска не является. См. ru.wikipedia.org/wiki/B-tree – Matt 23 July 2015 в 20:22

Индекс базы данных или просто индекс помогает ускорить извлечение данных из таблиц. Когда вы запрашиваете данные из таблицы, сначала MySQL проверяет, существуют ли индексы, тогда MySQL использует индексы для выбора точных физических соответствующих строк таблицы вместо сканирования всей таблицы.

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

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

Если индекс помогает ускорить данные запроса, почему бы нам не использовать индексы для всех столбцов? Если вы создаете индекс для каждого столбца, MySQL должен строить и поддерживать индексную таблицу. Всякий раз, когда изменения записываются в таблицу таблицы, MySQL должен перестроить индекс, что требует времени, а также снижает производительность сервера базы данных. Создание индекса MySQL

Вы часто создаете индексы при создании таблиц. MySQL автоматически добавляет в индекс любой столбец, который объявляется как PRIMARY KEY, KEY, UNIQUE или INDEX. Кроме того, вы можете добавлять индексы к таблицам, у которых уже есть данные.

Чтобы создать индексы, вы используете оператор CREATE INDEX. Ниже приведен синтаксис оператора CREATE INDEX: 1 2 3

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name USING [BTREE | HASH | RTREE] ON table_name (column_name [(length)] [ASC | DESC],...)

Сначала вы указываете индекс на основе типа таблицы или хранилища:

UNIQUE означает, что MySQL будет создайте ограничение, чтобы все значения в индексе были уникальными. Дублирующее значение NULL разрешено во всех механизмах хранения, кроме BDB. Индекс FULLTEXT поддерживается только механизмом хранения MyISAM и принимается только в столбце с типом данных CHAR, VARCHAR или TEXT. Индекс SPATIAL поддерживает пространственный столбец и доступен для механизма хранения MyISAM. Кроме того, значение столбца не должно быть NULL.

Затем вы указываете индекс и его тип после ключевого слова USING, такого как BTREE, HASH или RTREE, также на основе механизма хранения таблицы.

Ниже приведены механизмы хранения таблицы с соответствующими разрешенными типами индексов: Поддерживаемые типы индексов хранения MyISAM BTREE, RTREE InnoDB BTREE MEMORY / HEAP HASH, BTREE NDB HASH

В-третьих, вы заявляете имя таблицы и столбцы списка, которые вы хотите добавить в индекс. Пример создания индекса в MySQL

В примерной базе данных вы можете добавить столбец OfficeCode таблицы employee в индекс с помощью инструкции CREATE INDEX следующим образом: 1

CREATE INDEX officeCode ON employees(officeCode)

Удаление индексов

Помимо создания индекса, вы также можете удалить индекс, используя оператор DROP INDEX. Интересно, что оператор DROP INDEX также сопоставляется с выражением ALTER TABLE. Ниже приведен синтаксис удаления индекса: 1

DROP INDEX index_name ON table_name

Например, если вы хотите удалить индексный индекс OfficeCode таблицы сотрудников, который мы создали выше, вы может выполнить следующий запрос: 1

DROP INDEX officeCode ON employees

10
ответ дан sheriff 18 August 2018 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: