mysql - 索引的 DO 和 DONT

标签 mysql database performance database-design indexing

使用索引提高数据库性能的注意事项有哪些?

DO 是指应该创建索引的情况,或者是另一个可以提高性能的与索引相关的提示。

DONT 表示不应创建索引或可能损害性能的其他与索引相关的操作。

最佳答案

一般来说:

1。除非您确实需要,否则不要添加索引。

每个索引都会使写入变慢...

2。索引将用于 where 子句:

-- index on foo (bar)
select bar from foo where bar = :bar;

出于同样的原因,它将用于外键引用(在两个表上)。

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 

3。索引将用于排序,尤其是在绑定(bind)到限制时:

-- index on foo (bar)
select bar from foo order by bar limit 10;

4。当 2. 和 3. 都适用时,多列索引有时很有用。

在这种情况下,将 where 条件放在首位,排序键放在最后:

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5。及时更新您的表格统计信息。

如果表统计信息是垃圾,优化器使用您的索引的可能性很小。如果需要,手动清理/分析您的数据库。

6。索引使用情况取决于您的表重新分区。

超过检索行的特定阈值,执行全表扫描会更快。如果您的索引位于或多或少将您的表一分为二的 bool 字段上,则它永远不会被使用。

同样,如果您的数据以这样一种方式存储,即索引扫描最终可能会随机访问该表几乎所有适用的磁盘页面,那么规划器将更喜欢全表扫描。

7。考虑可用的部分/表达式索引。

如果您有一个字段除了 10% 的行之外具有相同的值,请考虑在其上设置部分索引(即不是该值的位置)。这会在不影响其实际用途的情况下产生更小的索引。

如果您不断查询应用于列的表达式并且您的平台提供表达式索引,请考虑在其上添加索引。使用时,不会为每一行计算表达式。

关于mysql - 索引的 DO 和 DONT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6098616/

相关文章:

mysql - 按空记录分组

database - PL/SQL - NOCOPY 参数以提高性能

php - session 、位置命令在 000webhost 中不起作用

php - 在创建高级 php 应用程序时,您如何知道如何设计 mysql 数据库?

sql - MariaDB '' 附近的错误语法

sql - 从一个表中获取行,并从相关表中获取 COUNT

c# - 为什么在排序输入上插入到我的树中比随机输入更快?

C++ 智能指针取消引用 - 检查它是否已初始化的开销是多少?

php - 如何显示用户上次登录 MySQL 的日期和时间?

php - 从 Codeigniter 中的数据库查询创建多维数组