数据库索引 - 索引 - 上
索引
这一章节, 我想讨论一些有趣的事情.
大表如何加索引
在大表上创建一个索引将花费大量的时间; 默认情况下, 在创建的索引时, PostgreSQL 允许读数据 (select);
但是, 写数据的操作(insert, update , delete)会被阻塞, 直到索引创建完毕;
在生产环境下这是无法接受的;
那么, 在生产环境下, 怎么添加索引呢?
数据库提供了一种可以并发创建索引的方法
create index concurrently index_name on table_name();
在索引创建完成之后, 数据库系统不得不和数据表(table) 保持同步;
这额外添加了数据的更新的操作;
因此, 索引如果很少在查询中用到, 它应该被删除;
为什么创建索引时, 不能有数据更新
答: 假如在创建索引时 如果有一条id = 100
数据插入;
此时, 索引上是没有id = 100 的记录的;
那么, 当下一次通过索引查询这条记录时, 数据库会找不到 id = 100 的记录;
因此, 数据库在创建索引时, 会锁表; 不能进行数据的更新;
索引会提高order by的速度吗
答: 会有影响; 但是只有 B-tree 会;
索引除了可以帮助查询以外, 还能够帮助查询返回特定的顺序;
尤其适用于 limit
对于一个需要扫描大量数据的查询, 一个显式的(explicit)排序可能比使用索引更快,
因为它遵循顺序访问模式,所以需要较少的磁盘I/O。
在查询的数据量小的时候, 索引可能会更有用;
举一个例子:
select * FROM employees
order by name
limit 10
在上面的sql中, 我们使用 order by
和 limit
如果, 我们没有在 name 上加入索引;