企业网站建设的方式有哪些方式,商务网站建设与维护 试题,遵义做网站多少钱,微信小程序开发需要什么本期来谈谈覆盖索引与延迟关联。在此之前#xff0c;我们先简单建立一个订单表 Orders 用于举例说明。表中共包含 3 个字段#xff1a;idintproduct_idnameCREATETABLEordersidint10NOTNULLCOMMENT订单 IDproduct_idint10DEFAULTNULLCOMMENT商品 IDnamevarchar255CHARACTERSE…本期来谈谈覆盖索引与延迟关联。在此之前我们先简单建立一个订单表 Orders 用于举例说明。表中共包含 3 个字段idintproduct_idnameCREATETABLEordersidint10NOTNULLCOMMENT订单 IDproduct_idint10DEFAULTNULLCOMMENT商品 IDnamevarchar255CHARACTERSETCOLLATEDEFAULTNULLCOMMENT订单名称KEYidKEYproduct_idxproduct_idUSINGENGINEInnoDBDEFAULTCHARSETCOLLATE覆盖索引什么是覆盖索引根据索引不包含覆盖索引MyISAMproduct_idSELECT product_id FROM ordersEXPLAINSELECTFROM------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------set0.00idSELECT id, product_id FROM orders WHERE product_id 1product_idproduct_id 1通过该子结点指针读取磁盘上的数据行id由于 MyISAM 的叶子结点存储着指向数据行的指针该查询多了一步回表操作无法使用覆盖索引。EXPLAINSELECTidFROMWHERE1------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------set0.00MyISAM 索引结构InnoDB二级索引的叶子结点保存着行的主键值InnoDB 二级索引的叶子结点包含行主键值SELECT id, product_id FROM orders WHERE product_id 1EXPLAINSELECTidFROMWHERE1------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------set0.01ExtraUsing indexproduct_idproduct_id 1id查询轨迹并未进行回表取值。延迟关联deferred join在查询的第一阶段 MySQL 使用覆盖索引再通过该覆盖索引查询到的结果到外层查询匹配需要的所有列值。这样说有些抽象我们来看看下面的例子。用延迟关联优化分页(LIMIT)LIMITLIMIT 10000, 20EXPLAINSELECTFROMLIMIT1000020------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------尽可能使用索引覆盖扫描而不是查询所有列EXPLAINSELECTFROMASJOINSELECTidFROMLIMIT1000020ASON------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------这样一来MySQL 在 SQL 语句的「内层」进行扫描时使用了覆盖索引「外层」再通过索引树找到相关的数据行直接减少了扫描的数据量。总结只需扫描索引无须回表deferred join参考资料《高性能 MySQL》[1]参考资料[1]https://book.douban.com/subject/23008813/更多阅读5分钟掌握在 Cython 中使用 C5 分钟掌握 Python 中常见的配置文件5 分钟掌握 Python 中的 Hook 钩子函数点击下方阅读原文加入社区会员