在过去的几个月里,我们将一些表从 MYiSAM 迁移到了 InnoDB。理论上,我们这样做是为了行锁定优势,因为我们通过多个网络抓取实例更新各个行。我现在在我的 slow_query_log (10s) 中建立了数以万计的 slow_queries。和很多全表扫描。我对一行进行非常简单的更新(更新 4 或 5 列)需要 28 秒。(我们的 I/O 和效率非常好,失败/中止的尝试非常低 < 0.5%)
我们更新最多的两个表以 ID (int 11) 作为主键。在 InnoDB 中,主键是一个聚集键,因此按 ID 顺序写入索引的磁盘。但是我们最重要的两个记录标识列是BillsofLading
和Container
(都是 varchar22)。我们的大多数 DML 查询都基于这两列查找记录。我们也有索引BillsofLading
,container.
据我了解,InnoDB 在创建这两个二级索引时也使用主键。
所以,我可以有一个ID
=1 和BillsofLading
='z' 的记录,以及另一个ID
=9 和BillsofLading
='a' 的记录。使用 InnoDB 索引,当基于 SELECT where BillsofLading
='a' 更新记录时,由于索引基于ID
?
在此先感谢您帮助这里的逻辑!