我对DB的了解有限,并且只使用DB作为应用程序员.我想知道Clustered和Non clustered indexes.我用谷歌搜索,发现的是:
聚簇索引是一种特殊类型的索引,它重新排序表中记录的物理存储方式.因此,表只能有一个聚簇索引.聚簇索引的叶节点包含数据页.非聚簇索引是一种特殊类型的索引,其中索引的逻辑顺序与磁盘上行的物理存储顺序不匹配.非聚簇索引的叶节点不包含数据页.相反,叶节点包含索引行.
我在SO中发现的是聚簇索引和非聚簇索引之间有什么区别?.
有人可以用简单的英语解释这个吗?
sql-server indexing performance clustered-index non-clustered-index
最近我学会了索引的奇迹,并且性能得到了显着提升.然而,凭借我所学到的一切,我似乎无法找到这个问题的答案.
索引很棒,但为什么有人只能将所有字段编入索引以使表格速度极快?我敢肯定有一个很好的理由不这样做,但三十字段表中的三个字段怎么样?30场比赛中10场比赛?人们应该在哪里画线,为什么?
作为" 什么是索引以及如何使用它们来优化我的数据库中的查询? " 的后续内容,我试图了解索引,哪些列是好的索引候选者?专门针对MS SQL数据库?
经过一些谷歌搜索,我读过的所有内容都表明,通常增加和唯一的列会产生一个很好的索引(比如MySQL的auto_increment),我理解这一点,但我使用的是MS SQL,我使用GUID作为主键,所以看来索引不会使GUID列受益......
为SQL Server数据库中的每个外键创建索引是一种好习惯吗?
自从我18个月前开始从事科技工作以来,我听说过他们.我知道它们可能会提高性能,而且它们似乎是特定于列的 - ("我们在date_of_birth列上索引User表").
只是想快速了解它们究竟是什么,它们的用途以及它们的工作原理.
索引如何帮助加速基于特定条件搜索数据?
如果有一个包含6列的表并且没有索引,则程序必须检查所有表行.
索引涉及创建另一个单独的表,其中只有两列,即要索引的id和列.
我不明白,这是如何帮助应用程序进行更快速的搜索?它不会读取整个6列表,但它仍然必须读取整个2列表,对吗?哪个行数相同......
我有点了解Magento中的索引是如何工作的,但我还没有看到任何关于此的好文档.我想知道以下内容.
我认为拥有这些信息对我船上的其他人来说非常有用,而这些信息并没有完全得到索引过程.
更新:在我的问题评论和Ankur的回答之后,我想我错过了一些关于正常数据库索引的知识.那么这只是Magento处理索引的版本,对我来说,更好的方法是在数据库索引方面得到我的答案,例如这里的链接数据库索引如何工作?
我现在有一些查询耗时太长(300毫秒),因为数据库已经增长到几百万条记录.幸运的是,对我来说,查询不需要查看大部分数据,最新的100,000条记录就足够了,所以我的计划是维护一个包含最新100,000条记录的单独表格并针对此运行查询.如果有人对更好的方法有任何建议,这将是伟大的.我真正的问题是,如果查询确实需要针对历史数据运行,有哪些选项,下一步是什么?我想到的事情:
这些事情是否正确,还有其他选择吗?某些数据库提供程序是否具有比其他数据库提供程序更多的功能来处理这些问题,例如将特定的表/索引指定为完全在内存中?
对不起,我应该提到这个,我正在使用mysql.
我忘了在上面提到索引.到目前为止,索引是我唯一的改进来源.为了识别瓶颈,我一直在使用maatkit进行查询,以显示是否正在使用索引.
我知道我现在正在远离问题的目的,所以也许我应该再做一个.我的问题是EXPLAIN说查询需要10毫秒而不是300毫秒jprofiler报告.如果有人有任何建议我会非常感激.查询是:
select bv.*
from BerthVisit bv
inner join BerthVisitChainLinks on bv.berthVisitID = BerthVisitChainLinks.berthVisitID
inner join BerthVisitChain on BerthVisitChainLinks.berthVisitChainID = BerthVisitChain.berthVisitChainID
inner join BerthJourneyChains on BerthVisitChain.berthVisitChainID = BerthJourneyChains.berthVisitChainID
inner join BerthJourney on BerthJourneyChains.berthJourneyID = BerthJourney.berthJourneyID
inner join TDObjectBerthJourneyMap on BerthJourney.berthJourneyID = TDObjectBerthJourneyMap.berthJourneyID
inner join TDObject on TDObjectBerthJourneyMap.tdObjectID = TDObject.tdObjectID
where
BerthJourney.journeyType='A' and
bv.berthID=251860 and
TDObject.headcode='2L32' and
bv.depTime is null and
bv.arrTime > '2011-07-28 16:00:00'
Run Code Online (Sandbox Code Playgroud)
而输出来自EXPLAIN:
+----+-------------+-------------------------+-------------+---------------------------------------------+-------------------------+---------+------------------------------------------------+------+-------------------------------------------------------+
| id | select_type …Run Code Online (Sandbox Code Playgroud) 我已经让mysql解释了以下查询:
SELECT carid,pic0,bio,url,site,applet
FROM cronjob_reloaded
WHERE
carid LIKE '%bmw%'
OR
carid LIKE '%mer%'
OR
age BETWEEN '5' AND '10'
OR
category IN ('used')
ORDER BY CASE
WHEN carid LIKE '%bmw%' OR carid LIKE '%mer%' THEN 1
WHEN age BETWEEN '5' AND '10' THEN 2
ELSE 3
END
Run Code Online (Sandbox Code Playgroud)
以下是解释结果:
EXPLAIN SELECT carid, pic0, bio, url, site, applet
FROM cronjob_reloaded
WHERE carid LIKE '%bmw%'
OR carid LIKE '%mer%'
OR carid IS NOT NULL
AND age
BETWEEN '5'
AND '10'
Run Code Online (Sandbox Code Playgroud)
我不明白这个:

为什么键为NULL?
我可以更快地进行此查询吗?它需要0.0035秒 …
indexing ×7
database ×6
mysql ×4
sql ×3
sql-server ×3
caching ×1
magento ×1
optimization ×1
performance ×1
php ×1
search ×1
t-sql ×1