use*_*157 4 mysql database-design
不是 DBA 所以请原谅我的无知...
我有一个包含 20 个字段的表,其中 8 个是外键。Mysql 默认为每个外键添加了一个索引。表有大约 10 万行。在检索数据时,一些外键会被使用,而另一些则不会。另外,我想为查询时经常使用的另外两个字段添加索引。
我的问题是——
1) 在下面的代码中,我们应该只索引字段“标准”还是应该将 col1、col2 创建为非聚集索引?
SELECT col1, col2
FROM table1
WHERE criteria
Run Code Online (Sandbox Code Playgroud)
我的理解 - 如果仅索引字段“标准”,则查询将使用索引来解析要检索的行。发布它会进行全表扫描以检索相关行
2)我可以删除外键上的索引并且仍然使外键约束起作用吗?
3) 具有 20 个字段的表上的 10 个索引。这会在插入过程中导致性能问题吗?
4) 索引最优存储方案——BTREE、RTREE、HASH。我假设 BTREE 用于具有 > 或 < 的查询,并为 = 查询使用散列。这是正确的方法吗?
任何建议将不胜感激。
在您显示的示例中,表达式将使用索引criteria来解析要检索的行,索引中的叶节点包含对相应行的引用,在 MyISAM 的情况下通过物理位置或通过主键值InnoDB 的情况。这样就避免了全表扫描。
请注意,如果查询优化器认为您的查询匹配太多表,它将忽略索引,因为执行表扫描同样快。以此类推,这就是为什么没有人费心将“the”一词放在书后索引中的原因。
不,MySQL 要求外键存在索引。如果索引已经存在,InnoDB 将使用它,但它会在必要时创建一个。我发现了一些极端情况,您可以通过在定义外键约束后删除索引来欺骗 InnoDB,但这不是可取的,因为索引对于快速检查引用完整性很重要。
确实,插入/更新/删除需要更新索引以反映添加或删除的值。但这并不像你担心的那么糟糕。此外,InnoDB 实现了一个“更改缓冲区”,它记录您的更新如何影响二级索引,并稍后与整个索引进行协调。
InnoDB 和 MyISAM 仅支持 BTREE 索引。InnoDB 还有一个称为自适应哈希的内部特性,它对频繁请求的索引条目进行哈希查找。但这是完全自动和透明的;您不必定义任何索引或调整任何配置参数。