AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 46
Accepted
Thomas Joulin
Thomas Joulin
Asked: 2011-01-04 14:22:37 +0800 CST2011-01-04 14:22:37 +0800 CST 2011-01-04 14:22:37 +0800 CST

RDBMS 上的“索引”是什么意思?[关闭]

  • 772
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,请访问帮助中心。
10年前关闭。

我像大多数开发人员一样使用索引(主要是在......好吧!索引),但我确信有很多微妙的方法可以使用索引来优化数据库。我不确定它是否特定于 DBMS 的任何实现。

我的问题是:什么是如何使用索引的好例子(除了基本的、明显的情况),当您在表上指定索引时,DBMS 如何优化其数据库?

index rdbms
  • 4 4 个回答
  • 4631 Views

4 个回答

  • Voted
  1. Best Answer
    randomx
    2011-01-04T15:15:40+08:002011-01-04T15:15:40+08:00

    将索引视为“目录”......这是指向文件中位置的指针的有序列表,也就是偏移量。假设您在表中存储了数百万条记录,而不是在表中搜索匹配条件,引用有序列表进行匹配要快得多,然后堆叠指向特定匹配行的指针。索引的一个完美示例是表的主键字段,最典型的是它的“id”字段。如果您想要行 id #11234566,向索引请求指向数据的指针比扫描数据源中的位置 11234566 要快得多。

    这是索引的不那么明显的用法:

    CREATE TABLE activity_log (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    activity_type_id SMALLINT UNSIGNED NOT NULL,
    datetime_created DATETIME
    KEY(activity_type_id),
    PRIMARY KEY(id)
    );
    CREATE TABLE activity_log_to_date_key (
    activity_log_id INT UNSIGNED NOT NULL,
    date_created_key  INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
    UNIQUE KEY(activity_log_id),
    KEY(date_created_key)
    );
    CREATE TABLE dim_datetime (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    date_hour DATETIME NOT NULL,
    PRIMARY KEY(id),
    KEY(date_hour)
    );
    

    您的操作可以创建日志记录,然后创建对索引日期时间的引用,该引用比您的日志表搜索/排序更快。然后在它自己的主键上加入你的日志表。如果您需要我对此进行扩展,请告诉我。我希望这是有道理的。

    示例查询:

    SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
    FROM activity_log_to_date_key a 
    INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
    LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
    WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';
    
    • 11
  2. David Spillett
    2011-01-04T14:37:12+08:002011-01-04T14:37:12+08:00

    很多人似乎错过的一点是,DBMS 通常(或只能)在查询中每个表引用只使用一个索引,如果它可以并且确实使用多个索引,那么使用组合索引可能会更快索引(如果存在)。

    例如,如果在大表中搜索行,WHERE AnIntegerColumn = 42 AND AnOtherInt = 69那么到达这些行的最快路径将是 AnIntegerColumn 和 AnOtherInt 两列上的索引。如果您只有一个单独的索引但没有组合索引,则数据库将搜索一个或另一个索引并使用第二个子句单独过滤结果,或者扫描两者并随后将结果结合起来。

    另一个可以使用复合索引改进的常见简单操作是WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn- 如果 SomeColumn 和 SomeOtherColumn 上有索引(以正确的顺序),则在某些情况下可以同时执行过滤和排序操作。

    添加过多的索引当然可能是一个糟糕的优化,因为用于存储索引的额外空间(以及如果您的数据库看到许多写入操作时维护它们的 IO 负载)可能是比稍微不太优化的读取查询更糟糕的问题,所以不要过度。

    • 9
  3. Gaurav
    2011-01-04T22:07:04+08:002011-01-04T22:07:04+08:00

    大卫和兰迪对此进行了介绍。我只是想补充一点,该EXPLAIN命令可以极大地帮助您确定何时从创建索引中节省大量资金,以及建议需要哪些索引。它将显示数据库运行查询所采取的步骤,以便您知道哪些位花费的时间最长。

    • 2
  4. jcolebrand
    2011-01-05T21:49:24+08:002011-01-05T21:49:24+08:00

    我还没有看到这里提到的是,当您有多个磁盘时,您可能希望将索引放在与数据实际所在位置不同的磁盘上。这可以加快一些操作。我认为这本身就值得一个问题。

    • 1

相关问题

  • 如何在 MySQL 中创建条件索引?

  • NoSQL 和传统的 RDBMS 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve