cja*_*ava 5 mysql full-table-scan
我正在阅读 MySql 索引优化的文档。
我找到了一个设置 --max-seeks-for-key=1000.I 在这里检查了 MySQL 的“服务器系统变量” 。
根据它
“通过将其设置为较低的值(例如 100),您可以强制 MySQL 更喜欢索引而不是表扫描”
.
我从全表扫描中了解到:
当查询需要访问大部分行时,顺序读取比通过索引读取要快。顺序读取最小化磁盘搜索,即使查询不需要所有行。
因此,如果 MySQL 正在执行全表扫描以最小化磁盘搜索,为什么要使用 --max-seeks-for-key=1000 来首选索引扫描,这可能会增加磁盘搜索。
在文档8.3.1.20 如何避免全表扫描中提到它是避免全扫描的一个步骤:使用 --max-seeks-for-key=1000 启动 mysqld
所以我很想知道 --max-seeks-for-key 是否有任何实际和有意义的用途。
好吧,我这里有一个由 Magento 执行的真实查询,我运行的是 MySQL 5.7
SELECT SQL_NO_CACHE
main_table.entity_id
FROM catalog_category_flat_store_2 AS main_table
LEFT JOIN core_url_rewrite AS url_rewrite ON
url_rewrite.category_id = main_table.entity_id
AND url_rewrite.is_system = 1
AND url_rewrite.store_id = 2
AND url_rewrite.id_path LIKE 'category/%'
WHERE main_table.include_in_menu = '1'
AND main_table.is_active = '1'
AND main_table.path LIKE '1/2/%'
ORDER BY main_table.position ASC
Run Code Online (Sandbox Code Playgroud)
当我设置max_seeks_for_key为670或更低时,查询将在 2 秒内运行。当该值较高时(默认非常高),查询大约需要6分钟。
是的,我知道这是一个糟糕的询问。它不是我写的,它是由 Magento 电子商务应用程序框架创建的。
我使用EXPLAIN来找出差异。我看到max_seeks_for_key它使用低值来表索引core_url_rewrite。如果值较高,则不会。
MySQL 5.6确实对同一查询使用索引,而无需对配置进行任何更改。
额外上下文:该catalog_category_flat_store_2表包含 732 条记录。该表core_url_rewrite有 180 万条记录。该索引是字段(JOIN 字段)上的非唯一索引,category_id基数为 571。结果为 629 行。
不要忘记运行ANALYSE TABLE来帮助 MySQL 做出正确的决定。