|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Механизмы хранения собирают статистические данные о таблицах для использования оптимизатором. Табличные статистические данные основаны на группах значения, где группа значения является рядом строк с тем же самым ключевым префиксным значением. В целях оптимизатора важная статистическая величина является групповым размером среднего значения.
MySQL использует групповой размер среднего значения следующими способами:
Чтобы оценить, как может, строки должны быть считаны из каждого ref доступ
Оценить, сколько произведет строка частичное соединение; то есть, число строк, которые произведет работа этой формы:
(...) JOINtbl_nameONtbl_name.key=expr
Как групповой размер среднего значения для индексировать увеличения, индексирование менее полезно в тех двух целях, потому что среднее число строк на поиск увеличивается: Для индексирования, чтобы быть хорошим в целях оптимизации, лучше, чтобы каждый индексировал цель значения небольшое количество строк в таблице. То, когда данный индексирует значение, приводит к большому количеству строк, индексирование менее полезно, и MySQL, менее вероятно, будет использовать это.
Групповой размер среднего значения связывается с табличным количеством элементов, которое является числом групп
значения. SHOW INDEX оператор выводит на экран значение количества элементов,
основанное на N/S, где N
число строк в таблице и S групповой размер среднего значения. То
отношение приводит к приблизительному количеству групп значения в таблице.
Для соединения, основанного на <=> оператор сравнения, NULL
не обрабатывается по-другому ни от какого другого значения: NULL <=> NULL,
так же, как
для любого другого N <=> NN.
Однако, для соединения, основанного на = оператор, NULL отличается от не -NULL значения:
не истина когда expr1 = expr2expr1 или expr2 (или оба), NULL. Это влияет ref доступы для
сравнений формы : MySQL не будет получать доступ к таблице если текущая
стоимость tbl_name.key = exprexpr 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 метод.