Questions tagged «index»

一种数据库结构,可以以磁盘空间为代价提高查询速度,并降低插入/更新的速度。它存储一个或多个排序的列的副本,但以不同的方式构造数据以允许更快地访问。

2
如何判断MySQL中是否使用索引进行排序?
我有一个带有ORDER BY子句的查询,该子句使用一列,该列是WHERE子句中使用的索引的最后一列,本质上是以下形式: SELECT cols FROM tables WHERE col_1 = x AND col_2 = y AND col_3 = z ORDER BY col_4 并按此顺序在列(col_1,col_2,col_3,col_4)上创建索引。 当我分析查询时,超过99%的时间用于“排序结果”状态。如果有区别,col_4是一个时间戳列。我了解到ORDER BY只能在某些情况下使用索引,但是对于优化器何时才能使用它仍然有些困惑。
10 mysql  index  sorting 

2
带有多列的Postgres全文搜索,为什么在索引中而不是在运行时连接?
在过去的几天里,我在postgres中遇到了全文搜索,并且在跨多列搜索时对索引有些困惑。 postgres 文档讨论了如何ts_vector在串联列上创建索引,如下所示: CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', title || ' ' || body)); 我可以这样搜索: ... WHERE (to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo')) 但是,如果我想有时仅搜索标题,有时仅搜索正文,有时两者都搜索,则需要3个单独的索引。如果我在第三列中添加了索引,则可能是6个索引,依此类推。 我在文档中没有看到的另一种方法是只是分别索引两列,然后使用普通WHERE...OR查询: ... WHERE (to_tsvector('english', title) @@ to_tsquery('english','foo')) OR (to_tsvector('english', body) @@ to_tsquery('english','foo')) 在大约一百万行中对这两个基准进行基准测试似乎在性能上基本没有区别。 所以我的问题是: 为什么我要连接这样的索引,而不是单独索引列?两者的优点/缺点是什么? 我最好的猜测是,如果我事先知道,我只想搜索两个列(一次不搜索),那么我只需要通过串联使用较少内存的一个索引。

2
是否可以通过SQL Server 2008强制索引保留在内存中?
我有一个包含几百万行的表,我需要不时地从中运行一些查询。第一次查询通常会很慢(大约10s),而后续查询通常会更快(大约1s)。几个小时后,缓慢/快速循环又开始了。 我已经在执行计划中检查了所有需要的索引均已存在并已正确使用,并且我认为性能差异是由于该索引实际上位于后续查询的内存中(我是对的,还是其他?可能的原因?) 我还使用索引来运行许多其他查询,但是这些查询耗时较少,其性能也不太关键,因此我担心那些索引实际上会将关键索引从内存缓存中推出。 除了明显的“添加更多RAM”修复程序之外,我还一直在考虑编写脚本脚本以每小时运行一次以将索引强制返回内存。 有没有更优雅的方法可以做到这一点?就像一种提示SQLServer的方法一样,如果它只有足够的内存来保持单个索引的高速缓存,那它应该是那个? 我知道通常最好的办法是不要将SQLServer与这类事情搞混,但是我查询的异常性质(运行很少,但是时间紧迫)使我相信这样做(如果可能) 。 我也很好奇,是否有办法知道给定时间在内存中缓存了哪些索引?


3
数据库中的多维索引
哪些数据库使用实际的多维索引?oracle是否曾经使用多个索引从表中获取数据,还是会始终采用似乎具有最高选择性的索引?其他dbms怎么样?
10 index 

4
在时间维度表中应该将索引放在哪里?
在阅读了该网站有关索引的问答后,我想到了一个问题。 如果使用的是时间维度表,而粒度级别较低则为日。索引应该放在哪里? Randy Melder的问题是:“索引”在RDBMS上意味着什么?说过 : 将索引视为“目录” ...即文件位置的指针的有序列表,又称偏移量 就时间维度而言,如果时间表存储了唯一年份的全天,则大多数数据研究可能针对特定的一天,特定的一周,特定的月份或特定的季度进行。 我的问题是:是否应该为所有这些字段设置索引? Day被认为是唯一的,因此对于这一天,我完全理解索引的使用。但是一个星期id将发生7次,一个月id将发生30/31次,一个季度id将或多或少发生120次。 还应该为那些字段添加索引吗? 还会有用吗? 我问你,因为在同一问题上,大卫·斯皮利特(David Spillett)说: 当然,添加过多的索引可能是一个糟糕的优化,因为用于存储索引的额外空间(如果您的DB看到许多写操作,则还有用于维护索引的IO负载)可能比最优读取请求稍差一些,这是一个更糟糕的问题。 ,所以不要过度操作。 那么,对于时间维度情况,最好的考虑因素是什么?


2
为什么Cassandra建议不要在高基数列上创建索引?
Cassandra文档指出, 在以下情况下不要使用索引: 在高基数列上,因为您随后查询了大量记录以获取少量结果。请参阅下面的使用高基数列索引的问题。 继续 如果在高基数列上创建索引,该索引具有许多不同的值,则字段之间的查询将导致许多查找,结果很少。在拥有十亿首歌曲的表中,按作者(通常是每首歌曲唯一的值)而不是按艺术家查找歌曲的效率很低。手动将表维护为索引形式而不是使用Cassandra内置索引可能会更有效。对于包含唯一数据的列,有时为了方便起见,最好使用索引,只要对具有索引列的表的查询量适中且不在恒定负载下即可。 但是从来没有真正回答这个问题:为什么效率低下?我不知道“手动将表作为索引的一种形式”是什么意思。但是,这却与“………有时为了方便起见,只要查询量适中,使用索引有时是很好的性能……”。 这是否只是在告诉我在何时何地可以使用PK?什么是效率低下?我的理解是,要查询索引的查询将需要查询集群中的每个¹节点,然后每个节点都将在其本地索引中进行查找,然后将结果汇总。除了我们要付出网络等待时间之外,这并不一定是昂贵的(每个索引查找都应该相当便宜),因为我们必须等待最慢的节点。我在这里想念什么吗? 但是,如果我有一个包含不计其数的项目的收藏集,那么在极少数情况下,需要通过一个不同但几乎独特的属性来查找……这是一种适当的用法,对吗? ¹每个?IDK,如果复制意味着复制因子为3时,它可以达到群集的1/3?
10 index  cassandra 

1
如何使用索引加快Postgres中的排序
我正在使用postgres 9.4。 的messages具有以下模式:消息属于FEED_ID,并且具有posted_at,还消息可以具有(在答复的情况)的父消息。 Table "public.messages" Column | Type | Modifiers ------------------------------+-----------------------------+----------- message_id | character varying(255) | not null feed_id | integer | parent_id | character varying(255) | posted_at | timestamp without time zone | share_count | integer | Indexes: "messages_pkey" PRIMARY KEY, btree (message_id) "index_messages_on_feed_id_posted_at" btree (feed_id, posted_at DESC NULLS …

2
截断/大插入后是否应该重建索引?
我有一个存储过程,它会在插入新数据(基于其他表中的数据,计算等)之前,截断每个表中各有约175万行的某些表。 基本轮廓非常简单: 截断表 在大约75,000的“批次”中插入175万行。 我想知道是否应该在此过程中的任何时候显式重建索引?例如 截断表 ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [或类似的东西] 插入175万行 也许 ALTER INDEX ALL ON xxx DISABLE 截断表 插入175万行 ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [或类似的东西] 非常感谢任何帮助...不是DBA-知道DB很好的开发人员会更准确!

1
如何为不平等查询建立索引?
我有基于浮点列的值排除数据的查询 select * from My_Table where my_Float_column != 0 and my_Float_column is not null 如果可以,我不想为浮点型索引。执行计划是否足够聪明,可以使用如下所示的过滤索引(在这里我仅索引0和null值)以提高性能? CREATE NONCLUSTERED INDEX IX_My_Table_Float_Filtered ON My_Table (my_Float_column) WHERE my_Float_column = 0 or my_Float_column is null

3
列出索引和约束
我正在查看我继承的应用程序的SQL Server数据库。我已经有大约10年没有研究SQL Server了,所以请多多包涵。 我正在查看的数据库表有一个bigint NOT NULL名为的列id,但是,当我检查约束时,没有看到任何约束,所有数据库表也是如此。 我是否假设这些表上没有主键并且没有索引(聚集或非聚集),对吗? 我运行了以下查询,结果似乎证实了我的怀疑: //**returns 0** select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS; //**returns no rows** select * from sys.indexes where object_id = (select object_id from sys.objects where name = 'NAME-OF-TABLE'); //**returns all tables in database** SELECT name FROM sys.tables WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0;

1
MySQL:大列的唯一约束
我正在尝试创建一个InnoDB表,该表包含VARCHAR最多可容纳3071个字符的列。我想UNIQUE对该列的数据施加约束。 MySQL似乎使用索引来强制执行约束。在InnoDB中,索引大小似乎被限制为767个字节-不足以VARCHAR(3071)容纳存储数据的列。 关于如何在不影响最大数据长度或使用InnoDB的情况下如何使数据库强制数据唯一性的想法?


4
如何故意对SQL Server索引进行分段?
我想在我拥有的SQL Server 2017测试数据库上有意创建坏索引条件,只是为了更好地理解这些维护脚本?SQL Server索引和统计信息维护 是否有快速/自动的方式来破坏索引完整性或增加索引碎片?您知道我有什么有用的资源可以实现这一目标吗?

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.