Spec-Zone .ru
спецификации, руководства, описания, API
|
Механизмы хранения собирают статистические данные о таблицах для использования оптимизатором. Табличные статистические данные основаны на группах значения, где группа значения является рядом строк с тем же самым ключевым префиксным значением. В целях оптимизатора важная статистическая величина является групповым размером среднего значения.
MySQL использует групповой размер среднего значения следующими способами:
Чтобы оценить, как может, строки должны быть считаны из каждого ref
доступ
Оценить, сколько произведет строка частичное соединение; то есть, число строк, которые произведет работа этой формы:
(...) JOINtbl_name
ONtbl_name
.key
=expr
Как групповой размер среднего значения для индексировать увеличения, индексирование менее полезно в тех двух целях, потому что среднее число строк на поиск увеличивается: Для индексирования, чтобы быть хорошим в целях оптимизации, лучше, чтобы каждый индексировал цель значения небольшое количество строк в таблице. То, когда данный индексирует значение, приводит к большому количеству строк, индексирование менее полезно, и MySQL, менее вероятно, будет использовать это.
Групповой размер среднего значения связывается с табличным количеством элементов, которое является числом групп
значения. SHOW INDEX
оператор выводит на экран значение количества элементов,
основанное на N/S
, где N
число строк в таблице и S
групповой размер среднего значения. То
отношение приводит к приблизительному количеству групп значения в таблице.
Для соединения, основанного на <=>
оператор сравнения, NULL
не обрабатывается по-другому ни от какого другого значения: NULL <=> NULL
,
так же, как
для любого другого N
<=> N
N
.
Однако, для соединения, основанного на =
оператор, NULL
отличается от не -NULL
значения:
не истина когда expr1
= expr2
expr1
или expr2
(или оба), NULL
. Это влияет ref
доступы для
сравнений формы
: MySQL не будет получать доступ к таблице если текущая
стоимость tbl_name.key
= expr
expr
NULL
, потому что сравнение
не может быть истиной.
Для =
сравнения, это не имеет значения сколько NULL
значения находятся в таблице. В целях оптимизации соответствующее значение является средним размером не -NULL
группы значения. Однако, MySQL в настоящий момент не позволяет тому среднему
размеру быть собранным или использоваться.
Для InnoDB
и MyISAM
таблицы, Вы имеете некоторый
контроль над набором табличной статистики посредством innodb_stats_method
и myisam_stats_method
системные переменные, соответственно. У этих переменных
есть три возможных значения, которые отличаются следующим образом:
Когда переменная устанавливается в nulls_equal
, все
NULL
значения обрабатываются как идентичные (то есть, они все формируют
единственную группу значения).
Если NULL
групповой размер значения намного выше чем среднее число не -NULL
групповой размер значения, этот метод скашивает групповой размер
среднего значения вверх. Это делает, индексируют, кажется, к оптимизатору менее полезны, чем это
действительно для соединений, которые ищут не -NULL
значения.
Следовательно, nulls_equal
метод может заставить оптимизатор не
использовать индексирование для ref
доступы, когда это должно.
Когда переменная устанавливается в nulls_unequal
,
NULL
значения не считают тем же самым. Вместо этого каждый NULL
оцените формирует отдельную группу значения размера 1.
Если у Вас есть многие NULL
значения, этот метод скашивает групповой
размер среднего значения вниз. Если среднее число не -NULL
групповой
размер значения является большим, рассчитывая NULL
значения каждый как
группа размера 1 причина оптимизатор, чтобы оценить слишком высоко значение индексирования для
соединений, которые ищут не -NULL
значения. Следовательно, nulls_unequal
метод может заставить оптимизатор использовать, это
индексирует для ref
поиски, когда другие методы могут быть лучше.
Когда переменная устанавливается в nulls_ignored
,
NULL
значения игнорируются.
Если Вы склонны использовать много соединений то использование <=>
вместо
=
, NULL
значения не являются особенными в сравнениях и
один NULL
равно другому. В этом случае, nulls_equal
соответствующий метод статистики.
innodb_stats_method
у системной переменной есть глобальное значение; myisam_stats_method
у системной переменной есть и глобальная переменная и значения сеанса. Установка глобального значения влияет на
набор статистики для таблиц от соответствующего механизма хранения. Установка значения сеанса влияет на набор
статистики только для текущего клиентского соединения. Это означает, что можно вынудить статистику таблицы быть
регенерированной с данным методом, не влияя на другие клиенты, устанавливая значение сеанса myisam_stats_method
.
Чтобы регенерировать табличную статистику, можно использовать любой из следующих методов:
Выполните myisamchk - stats_method =method_name
- проанализировать
Измените таблицу, чтобы заставить ее статистику выходить из моды (например,
вставлять строку и затем удалять ее), и затем установите myisam_stats_method
и проблема ANALYZE TABLE
оператор
Некоторые протесты относительно использования innodb_stats_method
и myisam_stats_method
:
Можно вынудить табличную статистику быть собранной явно, как только описано.
Однако, MySQL может также собрать статистические данные автоматически. Например, если в течение
выполняющихся операторов для таблицы, некоторые из тех операторов изменяют таблицу, MySQL может собрать
статистические данные. (Это может произойти для объема, вставляет или удаляет, или некоторые ALTER TABLE
операторы, например.), Если это происходит,
статистические данные собираются, используя любое значение innodb_stats_method
или myisam_stats_method
имеет в то время. Таким образом, если Вы соберете
статистические данные, используя один метод, но системная переменная устанавливается в другой метод,
когда статистические данные таблицы будут собраны автоматически позже, то другой метод будет
использоваться.
Нет никакого способа сказать, какой метод использовался, чтобы генерировать статистику для данной таблицы.
Эти переменные применяются только к InnoDB
и MyISAM
таблицы. У других механизмов хранения есть только один метод для того,
чтобы собрать табличные статистические данные. Обычно это ближе к nulls_equal
метод.