【发布时间】:2015-05-13 22:04:32
【问题描述】:
在过去的几个月里,我们将一些表从 MYiSAM 迁移到了 InnoDB。理论上,我们这样做是为了行锁定优势,因为我们正在通过多个网络抓取实例更新单个行。我现在在我的 slow_query_log (10s) 中建立了数以万计的 slow_queries。和很多全表扫描。我对一行进行非常简单的更新(更新 4 或 5 列)需要 28 秒。 (我们的 I/O 和效率非常好,失败/中止的尝试非常低
我们更新最多的两个表都以 ID (int 11) 作为主键。在 InnoDB 中,主键是一个聚集键,因此按 ID 顺序写入索引的磁盘。但是我们最重要的两个记录识别列是BillsofLading 和Container(都是varchar22)。我们的大多数 DML 查询都基于这两列查找记录。我们在BillsofLading 和container. 上也有索引
按照我的理解,InnoDB在创建这两个二级索引的时候也是使用主键的。
因此,我可以有一条记录为ID=1 和BillsofLading='z',以及另一条记录ID=9 和BillsofLading='a'。使用 InnoDB 索引,当基于 BillsofLading='a' 的 SELECT 更新记录时,由于索引基于 ID,我是否仍需要进行全面扫描才能找到 'a'?
提前感谢您在此处提供逻辑帮助!
【问题讨论】:
-
首先要做的是运行EXPLAIN来找出查询执行计划是什么以及资源被消耗在哪里。使用像 Mysql Workbench 或 Toad 这样的 GI 来运行解释,因为它们可以更好地呈现结果。
-
@DavidSoussan 我没有从 EXPLAIN 扩展中得到任何明显的指标。想知道它是否更多地是应用程序处理的指标,而不是实际的 DML 语句。
-
SHOW CREATE TABLE -- 可能有明显的事情。
标签: mysql innodb clustered-index full-table-scan