Questions tagged «index»

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

3
如何强制MySQL忽略所有索引?
我已经阅读了有关FORCE索引的文章,但是如何强制MySQL进行IGNORE ALL索引呢? 我尝试过SELECT * FROM tbl IGNORE INDEX(*),但是没有成功。 至于为什么我(和其他人)需要这样做:例如,我需要像这样通过tld总结引荐来源统计信息: SELECT count(*) as c, SUBSTRING ( domain_name, LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2 ) as tld FROM `domains_import` IGNORE INDEX(domain_name) GROUP BY tld ORDER BY c desc LIMIT 100 ...但是我始终必须查看定义了哪些索引,或者确定将通过Explain使用哪些索引。简单地编写IGNORE INDEX ALL而不关心就非常方便。 有人知道语法或技巧吗?(数十行通过MySQL定义表的行实际上不是捷径)。 从聊天讨论中添加: 贝克马克: 无索引= 148.5秒 索引= 180秒,并且仍在与发送数据一起运行SSD阵列是如此强大,以至于您几乎不需要关心数据缓存... 基准的定义: CREATE …
12 mysql  index  mysql-5.6 

3
具有高选择性和低选择性字段的复合索引顺序中的字段顺序
我有一个超过30亿行的SQL Server表。我的查询之一花费了很长时间,因此我正在考虑对其进行优化。查询如下所示: SELECT [Enroll_Date] ,Count(*) AS [Record #] ,Count(Distinct UserID) AS [User #] FROM UserTable GROUP BY [Enroll_Date] [Enroll_Date]是一个低选择性列,可能值少于50个,而UserID列是高选择性列,其中有2亿多个不同的值。根据我的研究,我相信我应该在这两列上创建非聚集复合索引,并且从理论上讲,高选择性列应该是第一列。但是我不确定我的工作是否可行,因为我在group by子句中使用了低选择性列。 该表没有聚簇索引。

1
除非使用OPTION(RECOMPILE),否则不使用索引SEEK。
(问题移至SO) 我有一个表(虚拟数据),其中聚集索引包含2列: 现在,我运行这两个查询: declare @productid int =1 , @priceid int = 1 SELECT productid, t.priceID FROM Transactions AS t WHERE (productID = @productid OR @productid IS NULL) AND (priceid = @priceid OR @priceid IS NULL) SELECT productid, t.priceID FROM Transactions AS t WHERE (productID = @productid) AND (priceid = @priceid) …

1
为什么我的索引查找可以估计正确的行数而排序运算符不能呢?
我有一个查询,该查询在谓词上使用函数,如下所示: commentType = 'EL' AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0) 我在commentType上有一个经过筛选的索引,该索引具有40K行,当我运行查询时,Index Seek的估计行数非常准确(大约11K),但是对于下一步(sort运算符),它完全忽略了统计信息,仅估算过滤索引中的总行数。 为什么会这样呢?我知道有关可保留性的基础知识,并且为了安全起见,我已经进行了测试,以实际日期(2014-01-01)替换dateadd和voila ...排序开始正确地猜测行数... 为什么会发生这种情况,我该如何解决?我无法通过固定日期...


1
在非常繁忙的表上创建索引
我们有一个insert\select每次都有很多表的表(例如每秒有100台计算机插入\更新)。 在即使一秒钟都无法锁定的表上创建索引的最佳方法是什么? 如果创建索引,我确定它会锁定请求,而我做不到。 这是一张有100万行以上的大表。

1
从不同表中使用ORDER BY选择TOP 1时如何设置索引视图
我正在努力在以下情况下设置索引视图,以便在执行以下查询时不会进行两次聚集索引扫描。每当我为该查询创建索引视图然后使用它时,它似乎都会忽略我在其上放置的任何索引: -- +++ THE QUERY THAT I WANT TO IMPROVE PERFORMANCE-WISE +++ SELECT TOP 1 * FROM dbo.TB_test1 t1 INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1 ORDER BY t1.somethingelse1 ,t2.somethingelse2; GO 表格设置如下: 两张桌子 它们由上面的查询通过内部联接联接 并按上面的查询从第一个表开始的列排序,然后从第二个表开始的列排序;仅选择TOP 1 (在下面的脚本中,还有一些行可以生成测试数据,以防万一有助于重现问题) -- +++ TABLE SETUP +++ CREATE TABLE [dbo].[TB_test1] ( [PK_ID1] [INT] IDENTITY(1, …


3
一两个索引?
我在数据库的表上创建了以下索引: CREATE INDEX [idx_index1] on [table1] (col1, col2, col3) 服务器建议以下“丢失”索引: CREATE INDEX [idx_index2] on [table1] (col1, col2) INCLUDE (col3, col4, col5, col6....) 在我看来,修改现有索引定义以包括建议的列,而不是创建需要维护的新索引,似乎是合乎逻辑的。在col1和col2上选择的查询可以与index2一样有效地使用index1。我是对的还是我可能错过了什么?

2
MySQL连接到另一个表时不使用索引
我有两个表,第一个表包含CMS中的所有文章/博客文章。其中一些文章也可能出现在杂志上,在这种情况下,它们与另一个包含杂志特定信息的表具有外键关系。 这是这两个表的创建表语法的简化版本,其中删除了一些不必要的行: CREATE TABLE `base_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_published` datetime DEFAULT NULL, `title` varchar(255) NOT NULL, `description` text, `content` longtext, `is_published` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `base_article_date_published` (`date_published`), KEY `base_article_is_published` (`is_published`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `mag_article` ( `basearticle_ptr_id` int(11) NOT NULL, …

2
如何防止每日索引碎片达到99%
我有一个供100.000名玩家使用的高分桌,每天被插入2次,每位玩家有一条记录。最终,该表中索引的索引碎片为99%。有没有办法通过调整设置来防止这种情况? CREATE TABLE HighScore( [id] [int] IDENTITY(1,1) NOT NULL, [user] [int] NULL, [player] [int] NULL, [round] [tinyint] NULL, [group] [int] NULL, [rank] [int] NULL, [delta] [int] NULL, [roundpoints] [int] NULL, [totalpoints] [int] NULL, PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS …

3
包含列与过滤索引
我们目前正在使用名为tb_tranfers的表。该表有4000万行,大小约为26 GB(数据11 GB,索引15 GB)。 10%到15%的行是软删除的行(DeletedDate不为null)。该应用程序仅使用DeletedDate为null的行。对该表的所有查询都将包含一个用于此目的的子句。 该表上有15个索引。缺少索引DMV包含使用DeletedDate作为包含列创建索引的建议。 WHERE DeleteDdate IS NULL在所有11个非簇状索引上使用筛选索引是否有帮助?还是将DeletedDate列作为包含的列会更好?

2
数据库何时在事务中更新其索引?
我试图了解插入中同时涉及索引和事务的事件顺序。 例如,Oracle文档指出: 如果在加载数据之前创建[或具有]一个或多个索引,则数据库必须在插入每一行时更新每个索引。 但是,如果我创建一个事务,插入五行,然后提交,会发生什么?是否为每个插入或仅在提交点更新索引? 逻辑告诉我,它们只会在提交点进行更新,因为在提交那些记录之前,更新的索引可能无法使用。但这是真的吗? 如果是这样,当我要插入100万行时,为了获得最佳性能,我应该对所有行进行一次大型提交,而不是对10万条记录进行10次事务处理?当然,我意识到,如果第999,999行失败,则存在更大的回滚风险。 抱歉,如果我的术语有点用完。我不是行业DBA。尽管对Oracle和Postgres是我最常使用的数据库,但是我对特定数据库的兴趣不大,与一般数据库无关。我已经搜索了这个主题,但找不到真正的答案。

2
未使用的索引最佳做法
根据此查询,如果我发现总读取量很少(非常接近0或0,例如1或2),而用户更新量则较高或中等(我无法通过此查询找到插入或删除的内容),行数很大时,理论上我应该删除索引。 SELECT DISTINCT OBJECT_NAME(s.[object_id]) AS ObjectName , p.rows TableRows , i.name AS [INDEX NAME] , (user_seeks + user_scans + user_lookups) AS TotalReads , user_updates UserUpdates FROM sys.dm_db_index_usage_stats s INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id INNER JOIN sys.partitions p ON p.object_id = i.object_id WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') …

2
如何在MySQL中为具有NULL值的列设计索引?
我有一个拥有4000万个条目的数据库,并希望使用以下WHERE子句运行查询 ... WHERE `POP1` IS NOT NULL && `VT`='ABC' && (`SOURCE`='HOME') && (`alt` RLIKE '^[AaCcGgTt]$') && (`ref` RLIKE '^[AaCcGgTt]$') && (`AA` RLIKE '^[AaCcGgTt]$') && (`ref` = `AA` || `alt` = `AA`) LIMIT 10 ; POP1是一个浮点列,也可以为NULL。POP1 IS NOT NULL应该排除大约50%的条目,这就是为什么我将其放在开头。所有其他术语仅会稍微减少该数字。 除其他外,我设计了一个index pop1_vt_source,它似乎没有使用,而使用了索引vt为第一列的索引。解释输出: | id | select_type | table | type | possible_keys …
11 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.