Используется странный индекс MySQL - PullRequest
1 голос
/ 05 апреля 2019

Я использую MySQL 8, и у меня все еще есть некоторые сомнения относительно того, как выбрать индекс для использования в различных запросах

Таблица выглядит так:

CREATE TABLE IF NOT EXISTS `collection_stats` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `date` DATE NOT NULL,
  `org_uuid` BINARY(16) NOT NULL,
  `project_uuid` BINARY(16) NOT NULL,
  `collection_name` VARCHAR(255) NOT NULL,
  `counter1` BIGINT UNSIGNED NOT NULL DEFAULT 0,
  `counter2` BIGINT UNSIGNED NOT NULL DEFAULT 0,
  `counter3` BIGINT UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  INDEX `date_index` (`date` ASC),
  INDEX `org_usage_index` (`org_uuid` ASC, `date` DESC),
  INDEX `project_usage_index` (`org_uuid` ASC, `project_uuid` ASC, `date` DESC),
  UNIQUE INDEX `collection_usage_index` (`org_uuid` ASC, `project_uuid` ASC, `collection_name` ASC, `date` DESC))
ENGINE = InnoDB;

Идея состоит в том, что у меня есть некоторые ежедневные статистические данные, организованные организацией, проектом, коллекцией (организация может иметь несколько проектов и проект с несколькими коллекциями).

Я хочу увидеть значения counter1, counter 2 и counter 3 для организации, проекта или коллекции за последние X дней.

Получение статистики по организации:

explain SELECT 
    org_uuid, project_uuid, collection_name, 
    counter1, counter2, counter3 
FROM collection_stats 
WHERE 
    org_uuid = UUID_TO_BIN('bb5c2330-1a85-11e9-8ad9-b728a2ed4173', 1)  AND 
    date >= DATE_SUB(NOW(), INTERVAL 10 DAY)
# id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
'1', 'SIMPLE', 'collection_stats', NULL, 'ref', 'collection_usage_index,date_index,org_usage_index,project_usage_index', 'collection_usage_index', '16', 'const', '8', '100.00', 'Using index condition'

Я вижу, что он использует collection_usage_index вместо org_usage_index, но у меня нет объяснения этому.

Получение статистики на уровне проекта

explain SELECT org_uuid, project_uuid, collection_name, counter1, counter2, counter3 FROM collection_stats 
WHERE 
    org_uuid = UUID_TO_BIN('bb5c2330-1a85-11e9-8ad9-b728a2ed4173', 1) AND
    project_uuid = UUID_TO_BIN('faafad18-1a85-11e9-8a1d-b7281ece80f6', 1) AND
    date >= DATE_SUB(NOW(), INTERVAL 10 DAY)

Объясните, говорит то же самое. Используя collection_usage_index вместо project_usage_index ..

Любое логическое объяснение этому. Моя таблица имеет только несколько строк для тестирования? Может быть причина?

1 Ответ

0 голосов
/ 05 апреля 2019

Вы используете функцию в предложении WHERE.Насколько мне известно, MySQL не может использовать функции и индексы.
Вы можете проверить, изменив date >= DATE_SUB(NOW(), INTERVAL 10 DAY) на DATE >= $DATE и проверив.

...