Cli*_*ote 12 mysql database indexing performance database-design
使用索引提高数据库性能有哪些DO和DONT?
DO应该是一个应该创建索引的情况,或者是另一个与提示性能相关的索引.
如果不应创建索引,或者可能损害性能的其他索引相关操作,则表示DONT.
Den*_*rdy 30
一般来说:
每个索引使写入速度变慢......
-- index on foo (bar)
select bar from foo where bar = :bar;
Run Code Online (Sandbox Code Playgroud)
同样,它将用于外键引用(在两个表上).
-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar));
Run Code Online (Sandbox Code Playgroud)
-- index on foo (bar)
select bar from foo order by bar limit 10;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,将where条件放在第一位,并将排序键放在最后:
-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;
Run Code Online (Sandbox Code Playgroud)
如果表统计信息是垃圾,则优化程序几乎不可能使用您的索引.如果需要,手动真空/分析您的数据库.
在检索到某个行阈值之后,执行全表扫描会更快.如果您的索引位于一个布尔字段上,该字段或多或少将您的表拆分为两个,则永远不会使用它.
同样,如果您的数据存储方式使索引扫描可能最终随机访问该表的几乎所有适用的磁盘页面,则计划程序将更喜欢全表扫描.
如果您的字段具有相同的值(10%的行除外),请考虑其上的部分索引(即不在该值的位置).这导致索引小得多而不妨碍其实际有用性.
如果您经常查询应用于列的表达式并且平台提供表达式索引,请考虑在其上添加索引.使用时,不会为每一行计算表达式.