Spec-Zone .ru
спецификации, руководства, описания, API
|
Понимание B-дерева и структур данных хеша может помочь предсказать, как различные запросы выполняют на различных
механизмах хранения, которые используют эти структуры данных в их, индексирует, особенно для MEMORY
механизм хранения, который позволяет Вам выбирать B-дерево или хеш,
индексирует.
B-дерево индексирует, может использоваться для сравнений столбца в выражениях, которые используют =
, >
, >=
, <
, <=
, или BETWEEN
операторы. Индексирование также может использоваться для LIKE
сравнения, если параметр LIKE
постоянная строка, которая не запускается с подстановочного символа.
Например, следующий SELECT
использование операторов индексирует:
SELECT * FROMtbl_name
WHEREkey_col
LIKE 'Patrick%';SELECT * FROMtbl_name
WHEREkey_col
LIKE 'Pat%_ck%';
В первом операторе, только строки с 'Patrick' <=
рассматриваются. Во втором операторе,
только строки с key_col
< 'Patricl''Pat' <=
рассматриваются. key_col
<
'Pau'
Следующий SELECT
операторы не используют, индексирует:
SELECT * FROMtbl_name
WHEREkey_col
LIKE '%Patrick%';SELECT * FROMtbl_name
WHEREkey_col
LIKEother_col
;
В первом операторе, LIKE
значение начинается с подстановочного символа. Во втором операторе, LIKE
значение не является константой.
Если Вы используете ... LIKE '%
и
string
%'string
более длинно чем три символа, MySQL использует Турбо алгоритм Бойер-Мура, чтобы инициализировать образец для строки и затем
использует этот образец, чтобы выполнить поиск более быстро.
Использование поиска
использует индексирует если col_name
IS NULLcol_name
индексируется.
Любой индексирует, который не охватывает все AND
уровни в WHERE
пункт не используется, чтобы
оптимизировать запрос. Другими словами, чтобы быть в состоянии использовать индексирование, префикс
индексирования должен использоваться в каждом AND
группа.
Следующий WHERE
использование пунктов индексирует:
... WHEREindex_part1
=1 ANDindex_part2
=2 ANDother_column
=3 /*index
= 1 ORindex
= 2 */... WHEREindex
=1 OR A=10 ANDindex
=2 /* optimized like "index_part1
='hello'" */... WHEREindex_part1
='hello' ANDindex_part3
=5 /* Can use index onindex1
but not onindex2
orindex3
*/... WHEREindex1
=1 ANDindex2
=2 ORindex1
=3 ANDindex3
=3;
Они WHERE
пункты не используют, индексирует:
/*index_part1
is not used */... WHEREindex_part2
=1 ANDindex_part3
=2 /* Index is not used in both parts of the WHERE clause */... WHEREindex
=1 OR A=10 /* No index spans all rows */... WHEREindex_part1
=1 ORindex_part2
=10
Иногда MySQL не использует индексирование, даже если Вы доступны. Одно обстоятельство, при котором это
происходит, - то, когда оптимизатор оценивает, что использование индексирования потребовало бы, чтобы MySQL
получил доступ к очень большому проценту строк в таблице. (В этом случае сканирование таблицы, вероятно, будет
намного быстрее, потому что оно требует, чтобы меньше искали.) Однако, если такой запрос использует LIMIT
чтобы получить только некоторые из строк, MySQL использует индексирование
так или иначе, потому что он может намного более быстро найти, что немного строк возвращаются в результате.
Хеш индексирует, имеют несколько различные характеристики от только обсужденных:
Они используются только для сравнений равенства, которые используют =
или <=>
операторы (но очень быстры). Они не используются для операторов сравнения такой
как <
та находка диапазон значений. Системы, которые полагаются на этот
тип поиска единственного значения, известны как "хранилища значения ключа";
чтобы использовать MySQL для таких приложений, хеш использования индексирует везде, где возможный.
Оптимизатор не может использовать хеш, индексируют, чтобы убыстриться ORDER BY
операции. (Этот тип индексирует, не может использоваться, чтобы
искать следующую запись в порядке.)
MySQL не может определить приблизительно, сколько строки там между двумя значениями
(это используется оптимизатором диапазона, чтобы решить, которые индексируют, чтобы использовать). Это
может влиять на некоторые запросы, если Вы изменяете a MyISAM
таблица к
индексированному хешем MEMORY
таблица.
Только целые ключи могут использоваться, чтобы искать строку. (С B-деревом индексируют, любой крайний левый префикс ключа может использоваться, чтобы найти строки.)