Tengo una tabla que tiene una clave externa a una tabla que almacena algunos datos de blobs. Cuando hago una combinación interna en las tablas con una condición en la tabla principal, el tipo de unión va de 'índice' a 'TODO'. Me gustaría evitar esto ya que mi tabla de blobs está en el orden de decenas de gigabytes. ¿Cómo puedo evitarlo?¿Cómo evito un escaneo de tabla completo con esta combinación interna básica?
Aquí es unirse a la del interior básica:
EXPLAIN SELECT m.id, b.id, b.data
FROM metadata m, blobstore b
WHERE m.fkBlob = b.id;
1, 'SIMPLE', 'm', 'index', 'fk_blob', 'fk_blob', '4', '', 1, 'Using index'
1, 'SIMPLE', 'b', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'blob_index.m.fkBlob', 1, ''
Aquí añado una condición en la mesa principal:
EXPLAIN SELECT m.id, b.id, b.data
FROM metadata m, blobstore b
WHERE m.fkBlob = b.id AND m.start < '2009-01-01';
1, 'SIMPLE', 'b', 'ALL', 'PRIMARY', '', '', '', 1, ''
1, 'SIMPLE', 'm', 'ref', 'fk_blob,index_start', 'fk_blob', '4', 'blob_index.b.id', 1, 'Using where'
en cuenta que el orden en que se enumeran las tablas ha cambiado. Ahora está haciendo un escaneo de tabla completo en la tabla de blob debido a una condición que he agregado con respecto a la tabla principal.
Aquí es el esquema:
DROP TABLE IF EXISTS `blob_index`.`metadata`;
CREATE TABLE `blob_index`.`metadata` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fkBlob` int(10) unsigned NOT NULL,
`start` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_blob` (`fkBlob`),
KEY `index_start` (`start`),
CONSTRAINT `fk_blob` FOREIGN KEY (`fkBlob`) REFERENCES `blobstore` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `blob_index`.`blobstore`;
CREATE TABLE `blob_index`.`blobstore` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`data` mediumblob NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Tu derecho, arrojé algunos datos allí, ejecuté la tabla de análisis en ambas tablas, y ahora la primera combinación es de tipo rango en la tabla meta. – Fredrick