Mysql, explain, откуда взялся using where
Таблица
CREATE TABLE `contest_uploads` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`content` VARCHAR(255) NOT NULL,
`published` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`status` ENUM('disabled','enabled','unknown') NOT NULL DEFAULT 'unknown',
`tag_name` VARCHAR(32) NULL DEFAULT NULL,
`email` VARCHAR(255) NOT NULL,
`user_name` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) NOT NULL,
`id_group` INT(11) NOT NULL DEFAULT '0',
`check_sum` BINARY(16) NULL DEFAULT NULL,
`image_id` INT(11) NULL DEFAULT '0',
`vote_count` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE INDEX `IX_check_sum` (`check_sum`, `id_group`),
INDEX `IX_htc_uploads_email` (`email`),
INDEX `UK_htc_uploads_published` (`published`),
INDEX `UK_uploads_group_id` (`status`, `published`),
INDEX `UK_uploads_tag_name` (`tag_name`),
INDEX `IX_contest_uploads` (`status`, `id_group`, `vote_count`)
)
COLLATE='cp1251_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=14209;
Запрос
explain SELECT *
FROM contest_uploads
WHERE status = 'enabled' AND
id_group = 50 and vote_count = 33
Выдаёт:
(`id`, `select_type`, `table`, `type`, `possible_keys`, `key`, `key_len`, `ref`, `rows`, `Extra`)
(1, 'SIMPLE', 'contest_uploads', 'ref', 'IX_contest_uploads', 'IX_contest_uploads', '9', 'const,const,const', 12, 'Using where')
Откуда взялся Using where в столбце extra?
CREATE TABLE `contest_uploads` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`content` VARCHAR(255) NOT NULL,
`published` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`status` ENUM('disabled','enabled','unknown') NOT NULL DEFAULT 'unknown',
`tag_name` VARCHAR(32) NULL DEFAULT NULL,
`email` VARCHAR(255) NOT NULL,
`user_name` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) NOT NULL,
`id_group` INT(11) NOT NULL DEFAULT '0',
`check_sum` BINARY(16) NULL DEFAULT NULL,
`image_id` INT(11) NULL DEFAULT '0',
`vote_count` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE INDEX `IX_check_sum` (`check_sum`, `id_group`),
INDEX `IX_htc_uploads_email` (`email`),
INDEX `UK_htc_uploads_published` (`published`),
INDEX `UK_uploads_group_id` (`status`, `published`),
INDEX `UK_uploads_tag_name` (`tag_name`),
INDEX `IX_contest_uploads` (`status`, `id_group`, `vote_count`)
)
COLLATE='cp1251_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=14209;
Запрос
explain SELECT *
FROM contest_uploads
WHERE status = 'enabled' AND
id_group = 50 and vote_count = 33
Выдаёт:
(`id`, `select_type`, `table`, `type`, `possible_keys`, `key`, `key_len`, `ref`, `rows`, `Extra`)
(1, 'SIMPLE', 'contest_uploads', 'ref', 'IX_contest_uploads', 'IX_contest_uploads', '9', 'const,const,const', 12, 'Using where')
Откуда взялся Using where в столбце extra?
1 ответов
если в таблице малое количество записей, то планировщик запросов может не использовать индексы, а просто перебирать все записи, либо же использовать не совсем очевидные индексы. в таком случае и будет where либо что-то еще. попробуйте увеличить количество записей в 10 раз.
кроме того, существуют ситуации, когда explain не совсем соответствует тому, как будет выполняться запрос.
Вы используете WHERE в запросе чтобы выбрать часть данных, что удивительного что это написано в extra?
Using where
A WHERE clause is used to restrict which rows to match against the next table or send to the client...