Fre*_*ick 6 mysql blob inner-join query-optimization
我有一个表具有存储一些blob数据的表的外键.当我在主表上使用条件对表进行内连接时,连接类型从'index'变为'ALL'.我想避免这种情况,因为我的blob表大约是几十千兆字节.我怎么能避免呢?
这是基本的内部联接:
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, ''
Run Code Online (Sandbox Code Playgroud)
在这里我在主表上添加一个条件:
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'
Run Code Online (Sandbox Code Playgroud)
请注意,列出表的顺序已更改.它现在在blob表上进行全表扫描,因为我已经添加了关于主表的条件.
这是架构:
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;
Run Code Online (Sandbox Code Playgroud)
我猜你正在空表上尝试这个(因为MySQL认为它需要遍历一行来进行全表扫描),这可能会影响调度程序的结果。当您在真实的桌子上执行此操作时,EXPLAIN结果可能会有所不同(实际上在我的测试中确实有所不同)。
| 归档时间: |
|
| 查看次数: |
2905 次 |
| 最近记录: |