mysql - 如何避免使用此基本内部联接进行全表扫描?

标签 mysql query-optimization blob inner-join

我有一个表,该表具有存储一些 blob 数据的表的外键。当我在主表上使用条件对表进行内部联接时,联接类型从“索引”变为“全部”。我想避免这种情况,因为我的 blob 表大约有数十 GB。我怎样才能避免它?

这是基本的内连接:

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, ''

这里我在主表上加了一个条件:

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'

请注意,表的列出顺序已更改。由于我添加的关于主表的条件,它现在正在对 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;

最佳答案

我猜你是在空表上尝试这个(因为 MySQL 认为它需要通过一行来进行全表扫描),这可能会影响调度程序的结果。当您在真实表上执行此操作时,EXPLAIN 结果可能会有所不同(实际上在我的测试中确实有所不同)。

关于mysql - 如何避免使用此基本内部联接进行全表扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1952561/

相关文章:

azure - 无法通过 CNAME URI 访问 blob

MySQL LOAD XML 导入性能

php - 在codeigniter php中根据性别显示不同的前缀

mysql - 为什么在 Laravel 5.8 中创建外键失败?

sql - DB2 中 WHERE 子句求值顺序的优化

sql - 选择 'highest' X 行而不排序

javascript - 使用 JavaScript 从 Firebase 存储重命名或下载文件

mysql - 如何使用 shell 脚本在 MySql 数据库中批量插入/更新图像

php - Laravel DB get() 很慢

neo4j - 重构大型密码联合查询