Questions tagged «index»

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

5
高效地过滤带析取的大集合
假设我只有一张桌子 CREATE TABLE Ticket ( TicketId int NOT NULL, InsertDateTime datetime NOT NULL, SiteId int NOT NULL, StatusId tinyint NOT NULL, AssignedId int NULL, ReportedById int NOT NULL, CategoryId int NULL ); 在此示例中TicketId是主键。 我希望用户能够针对此表创建“部分即席”查询。我之所以说是部分原因是因为查询的某些部分将始终固定: 该查询将始终对 InsertDateTime 查询将始终 ORDER BY InsertDateTime DESC 查询将分页结果 用户可以选择对其他任何列进行过滤。它们可以过滤一个,一个或多个。并且对于每个列,用户可以从一组值中进行选择,这些值将被用作析取。例如: SELECT TicketId FROM ( SELECT TicketId, ROW_NUMBER() …

2
在什么时候索引有效
我发现很多资源都提到向表中添加索引可以加快搜索速度,并降低插入速度,但前提是表很大。这会产生一个折衷,这是一个设计决定,但是应该有一个近似的表大小,然后才可以使用索引。(例如,十行可能低于该限制) 是否有人知道此限制在哪里,或者知道有什么资源可以向我指出正确的方向?

1
服务器并发truncate命令崩溃后,MySQL INNODB损坏
我认为我的服务器今天崩溃了,原因是我们的一个INNODB表上有一个并发的truncate table命令。服务器可以重新启动,但是在启动之后,每次我尝试发出SQL命令时,都会出现以下错误: ERROR 2006 (HY000): MySQL server has gone away 这是在日志中发生的事情: 121206 01:11:12 mysqld restarted 121206 1:11:13 InnoDB: Started; log sequence number 275 559321759 InnoDB: !!! innodb_force_recovery is set to 1 !!! 121206 1:11:13 [Note] /usr/libexec/mysqld: ready for connections. Version: '5.0.95-log' socket: '/var/lib/mysql/mysql.sock' port: 3306 Source distribution InnoDB: Error: trying …

2
SQL Server如何为外键引用选择索引键?
我正在使用从MS Access导入的旧数据库。在MS Access> SQL Server升级期间创建了大约二十个带有非集群唯一主键的表。 这些表中的许多表还具有唯一的非聚集索引,这些索引与主键重复。 我正在尝试清理。 但是我发现的是,在将主键重新创建为聚簇索引之后,然后尝试重建外键,该外键引用了旧的重复索引(这是唯一的)。 我知道这是因为它不会让我删除重复的索引。 我认为如果存在,SQL Server总是会选择一个主键。SQL Server是否具有在唯一索引和主键之间进行选择的方法? 要复制该问题(在SQL Server 2008 R2上): IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Child') DROP TABLE Child GO IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Parent') DROP TABLE Parent GO -- Create the parent table CREATE …



4
如何进一步优化此MySQL查询?
我的查询要花特别长的时间(15+秒),并且随着时间的推移,随着数据集的增长,查询只会变得越来越糟。我过去对此进行了优化,并添加了索引,代码级排序和其他优化,但是还需要进一步完善。 SELECT sounds.*, avg(ratings.rating) AS avg_rating, count(ratings.rating) AS votes FROM `sounds` INNER JOIN ratings ON sounds.id = ratings.rateable_id WHERE (ratings.rateable_type = 'Sound' AND sounds.blacklisted = false AND sounds.ready_for_deployment = true AND sounds.deployed = true AND sounds.type = "Sound" AND sounds.created_at > "2011-03-26 21:25:49") GROUP BY ratings.rateable_id 查询的目的是让我获得sound id以及最近发布的声音的平均评分。大约有1500种声音和200万种评级。 我有几个指数 sounds …

2
可以同时在不同的表上运行两个DBCC INDEXDEFRAG命令吗?
我当前正在运行一个脚本,该脚本在SQL Server 2005数据库中的每个表上一次执行一个DBCC INDEXDEFRAG。由于空间限制和正常运行时间的要求,不能选择使用DBCC DBREINDEX而不是INDEXDEFRAG。 我注意到,某些表需要很长时间才能进行碎片整理。例如,如果我检查“ sys.dm_exec_requests”动态管理视图,则可以看到以下INDEXDEFRAG当前正在删除table_id为829610394的表的聚集索引: DBCC索引(0,829610394,1) 我知道碎片整理过程需要很长时间才能完成。撇开当前正在运行的脚本最终会对所有表进行碎片整理这一事实,在执行当前命令时在另一个表的聚集索引上手动运行另一个DBCC INDEXDEFRAG是否对我有什么危害?如果执行此操作,实际上是否会同时对两个表进行碎片整理?


2
集群索引现在必须-为什么?
早些时候,关于是否(始终)参与/避免聚集索引的辩论/讨论对我来说不是结论性的。 好吧,我知道有时要结合适当的特定目的和上下文来使用它们。 SQL Azure数据库群集索引要求: “ SQL Azure不支持没有聚簇索引的表。表必须具有聚簇索引。如果创建的表没有聚簇约束,则必须先创建聚簇索引,然后才能对表进行插入操作” 不符合先前的结论,理由和解释。 在先前的解释中,我遗漏了没有任何例外地严格施加聚集索引的基本原理是什么?

2
为什么mysql使用错误的索引来按查询排序?
这是我的表,具有约10,000,000行数据 CREATE TABLE `votes` ( `subject_name` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `subject_id` int(11) NOT NULL, `voter_id` int(11) NOT NULL, `rate` int(11) NOT NULL, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`subject_name`,`subject_id`,`voter_id`), KEY `IDX_518B7ACFEBB4B8AD` (`voter_id`), KEY `subject_timestamp` (`subject_name`,`subject_id`,`updated_at`), KEY `voter_timestamp` (`voter_id`,`updated_at`), CONSTRAINT `FK_518B7ACFEBB4B8AD` FOREIGN KEY (`voter_id`) REFERENCES `users` (`id`) ) …

1
索引列顺序的WHERE-JOIN-ORDER-(SELECT)规则是否错误?
我正在尝试将此(子)查询改进为更大查询的一部分: select SUM(isnull(IP.Q, 0)) as Q, IP.OPID from IP inner join I on I.ID = IP.IID where IP.Deleted=0 and (I.Status > 0 AND I.Status <= 19) group by IP.OPID Sentry Plan Explorer指出了由上面的查询执行的一些相对昂贵的表dbo。[I]键查找。 表dbo.I CREATE TABLE [dbo].[I] ( [ID] UNIQUEIDENTIFIER NOT NULL, [OID] UNIQUEIDENTIFIER NOT NULL, [] UNIQUEIDENTIFIER NOT NULL, [] …

1
通过删除运算符哈希匹配内部联接来提高查询性能
在尝试将以下问题的内容应用于我自己的情况时,我有点困惑,因为如果可能的话,如何摆脱运算符哈希匹配(内部联接)。 SQL Server查询性能-无需哈希匹配(内部联接) 我注意到了10%的成本,并且想知道是否可以降低它。请参阅下面的查询计划。 这项工作来自我今天必须调整的一个查询: SELECT c.AccountCode, MIN(d.CustomerSID) FROM Stage.Customer c INNER JOIN Dimensions.Customer d ON c.Email = d.Email OR ( c.HomePostCode = d.HomePostCode AND c.StrSurname = d.strSurname ) GROUP BY c.AccountCode 在添加这些索引之后: --------------------------------------------------------------------- -- Create the indexes --------------------------------------------------------------------- CREATE NONCLUSTERED INDEX IDX_Stage_Customer_HOME_SURNAME_INCL ON Stage.Customer(HomePostCode ,strSurname) INCLUDE (AccountCode) --WHERE HASEMAIL …

2
如果复合索引包含主键,是否应该将其标记为唯一?
给定一些带有主键的表,例如: CREATE TABLE Customers ( CustomerID int NOT NULL PRIMARY KEY, FirstName nvarchar(50), LastName nvarchar(50), Address nvarchar(200), Email nvarchar(260) --... ) 我们在上有一个唯一的主键CustomerID。 传统上,我可能需要一些额外的覆盖索引。例如,通过CustomerID或快速查找用户Email: CREATE INDEX IX_Customers_CustomerIDEmail ON Customers ( CustomerID, Email ) 这些都是我数十年来创建的索引。 不一定要唯一,但实际上是 索引本身的存在是为了避免进行表扫描。它是覆盖索引,以帮助提高性能(该索引不存在作为强制执行唯一性的约束)。 今天,我想起了一些信息-SQL Server可以使用以下事实: 列具有外键约束 列具有唯一索引 约束是可信的 为了帮助它优化查询执行。实际上,根据《SQL Server索引设计指南》: 如果数据是唯一的并且您要强制执行唯一性,那么在相同的列组合上创建唯一索引而不是非唯一索引将为查询优化器提供附加信息,从而可以产生更有效的执行计划。在这种情况下,建议创建唯一索引(最好通过创建UNIQUE约束)。 鉴于我的多列索引包含主键,因此该复合索引实际上将是唯一的。这不是我特别需要SQL Server在每次插入或更新期间强制执行的约束;但是事实是该非聚集索引是唯一的。 将这个事实上的唯一索引标记为实际上唯一有什么好处吗? 在客户上创建唯一索引IX_Customers_CustomerIDEmail ( 客户ID, 电子邮件 …

2
在MySQL 5.5中具有类似PostgreSQL的部分索引
我有大数据,一次只能选择一小段数据,因此选择总是按顺序进行的。我正在尝试针对此类目的在MySQL中实现像部分索引这样的PostgreSQL。我不确定部分唯一约束是否与我想要的约束相同。 PostgreSQL 9.4中的代码 CREATE UNIQUE INDEX dir_events ON events (measurement_id) USING btree (eventBody) WHERE is_active; 在MySQL中尝试ypercube的部分索引 CREATE UNIQUE INDEX dir_events [index_type] -- TODO what here? ON events (measurement_id, is_active) [index_type] -- TODO what here? 如何在MySQL 5.5或类似版本中创建类似PostgreSQL的部分索引?
9 mysql  index 

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.