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


21

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

我的问题是:什么是如何使用索引的好示例(基本情况,显而易见的情况除外),以及在表上指定索引时DBMS如何优化其数据库?


在进一步思考这个问题时,这个问题对于这个站点来说太笼统了。如果我们更改可能适当的问题的范围,否则此问题不适用于该站点。
jcolebrand

我想使用库隐喻mysqlperformanceblog.com/2011/08/30/…解释索引。看看是否有帮助。–
Jonathan

Answers:


11

可以将索引视为“目录”……这是指向文件中位置(也称为偏移量)的指针的有序列表。假设您在表中存储了数百万条记录,而不是在表中搜索匹配条件,那么引用匹配的有序列表要快得多,然后将指针堆叠到特定的匹配行。索引的一个完美示例是表的主键字段,最典型的是其“ 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';

谢谢,这很清楚!在您的示例中,“ PRIMARY”会改变RDMBS存储“ offset”的方式,还是仅用于唯一性约束?
Thomas Joulin 2011年

9

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

例如,如果在大表中搜索行,WHERE AnIntegerColumn = 42 AND AnOtherInt = 69则到这些行的最快路线将是AnIntegerColumn和AnOtherInt两列的索引。如果每个索引上只有一个索引,而没有组合索引,则DB会搜索一个或另一个索引,并使用第二个子句分别过滤结果,或者扫描两个索引,然后将结果汇总。

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

当然,添加过多的索引可能是一个糟糕的优化,因为用于存储索引的额外空间(如果您的DB看到许多写操作,则还有用于维护索引的IO负载)可能比最优读请求稍差一些,这是一个更糟糕的问题。 ,所以不要过度操作。


2

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


要添加到Gaurav的答案中,请使用“ EXPLAIN EXTENDED”,然后立即键入“ SHOW WARNINGS”以查看查询的翻译方式。
randomx 2011年

1

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


过去确实如此,但是如今,我们说不要试图猜测您的I / O子系统。无论如何,您都不知道存储阵列将在何处放置数据。
Gaius

1
@gaius我宁愿意味着,如果你没有一个RAID5(或类似)的设置,把指标上,E:,F上的数据:等
jcolebrand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.