数据库索引数据库索引是什么,有什么优点和缺点

数据库索引  时间:2021-08-11  阅读:()

数据库索引的操作案例

最普通的情况,是为出现在where子句的字段建一个索引。

为方便讲述,先建立一个如下的表。

CREATE TABLE mytable( idserial primary key, category_id int not null default0, user_id int not null default0, adddate int not null default0 ); 如果在查询时常用类似以下的语句: SELECT * FROM mytable WHERE category_id=1; 最直接的应对之道,是为category_id建立一个简单的索引: CREATE INDEX mytable_categoryid ON mytable (category_id); OK.如果有不止一个选择条件呢?例如: SELECT * FROM mytable WHERE category_id=1 AND user_id=2; 第一反应可能是,再给user_id建立一个索引。

不好,这不是一个最佳的方法。

可以建立多重的索引。

CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id); 注意到在命名时的习惯了吗?使用表名_字段1名_字段2名的方式。

很快就会知道为什么这样做了。

现在已经为适当的字段建立了索引,不过,还是有点不放心吧,可能会问,数据库会真正用到这些索引吗?测试一下就OK,对于大多数的数据库来说,这是很容易的,只要使用EXPLAIN命令: EXPLAIN SELECT * FROM mytable WHERE category_id=1 AND user_id=2; This is what Postgres 7.1 returns (exactlyasI expected) NOTICE:QUERY PLAN: Index Scan using mytable_categoryid_userid on mytable(cost=0.00..2.02 rows=1 width=16) EXPLAIN 以上是postgres的数据,可以看到该数据库在查询的时候使用了一个索引(一个好开始),而且它使用的是创建的第二个索引。

看到上面命名的好处了吧,马上知道它使用适当的索引了。

接着,来个稍微复杂一点的,如果有个ORDERBY 子句呢?不管你信不信,大多数的数据库在使用orderby的时候,都将会从索引中受益。

SELECT * FROM mytable WHERE category_id=1 AND user_id=2 ORDER BY adddate DESC; 很简单,就像为where子句中的字段建立一个索引一样,也为ORDER BY的子句中的字段建立一个索引: CREATE INDEX mytable_categoryid_userid_adddate ON mytable (category_id,user_id,adddate); 注意:mytable_categoryid_userid_adddate将会被截短为mytable_categoryid_userid_addda CREATE EXPLAIN SELECT * FROM mytable WHERE category_id=1 AND user_id=2 ORDER BY adddate DESC; NOTICE:QUERY PLAN: Sort(cost=2.03..2.03 rows=1 width=16) ->Index Scanusing mytable_categoryid_userid_addda on mytable(cost=0.00..2.02 rows=1 width=16) EXPLAIN 看看EXPLAIN的输出,数据库多做了一个没有要求的排序,这下知道性能如何受损了吧,看来对于数据库的自身运作是有点过于乐观了,那么,给数据库多一点提示吧。

为了跳过排序这一步,并不需要其它另外的索引,只要将查询语句稍微改一下。

这里用的是postgres,将给该数据库一个额外的提示--在ORDER BY语句中,加入where语句中的字段。

这只是一个技术上的处理,并不是必须的,因为实际上在另外两个字段上,并不会有任何的排序操作,不过如果加入,postgres将会知道哪些是它应该做的。

EXPLAIN SELECT * FROM mytable WHERE category_id=1 AND user_id=2 ORDER BY category_id DESC,user_id DESC,adddate DESC; NOTICE:QUERY PLAN: Index Scan Backward using mytable_categoryid_userid_addda on mytable(cost=0.00..2.02 rows=1 width=16) EXPLAIN 现在使用料想的索引了,而且它还挺聪明,知道可以从索引后面开始读,从而避免了任何的排序。

以上说得细了一点,不过如果数据库非常巨大,并且每日的页面请求达上百万算,想会获益良多的。

不过,如果要做更为复杂的查询呢,例如将多张表结合起来查询,特别是where限制字句中的字段是来自不止一个表格时,应该怎样处理呢?通常都尽量避免这种做法,因为这样数据库要将各个表中的东西都结合起来,然后再排除那些不合适的行,搞不好开销会很大。

如果不能避免,应该查看每张要结合起来的表,并且使用以上的策略来建立索引,然后再用EXPLAIN命令验证一下是否使用了料想中的索引。

如果是的话,就OK。

不是的话,可能要建立临时的表来将他们结合在一起,并且使用适当的索引。

要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。

对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。

以上介绍的只是一些十分基本的东西,其实里面的学问也不少,单凭EXPLAIN是不能判定该方法是否就是最优化的,每个数据库都有自己的一些优化器,虽然可能还不太完善,但是它们都会在查询时对比过哪种方式较快,在某些情况下,建立索引的话也未必会快,例如索引放在一个不连续的存储空间时,这会增加读磁盘的负担,因此,哪个是最优,应该通过实际的使用环境来检验。

在刚开始的时候,如果表不大,没有必要作索引,意见是在需要的时候才作索引,也可用一些命令来优化表,例如MySQL可用OPTIMIZETABLE。

数据库索引是什么,有什么用,怎么用

索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。

索引包含由表或视图中的一列或多列生成的键。

这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。

索引其实关键目的是为了加快检索速度而建立的,所以,怎么用索引是数据库系统本身的事情,作为数据库设计或使用者,设计并创建好索引然后体验加上索引后的查询变快的感觉就行了。

所以,索引怎么用就变为了“怎么创建合适的索引”

表的索引是什么意思

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。

如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

例如这样一个查询:select * from table1 where id=10000。

如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。

由于索引是经过某种算法优化过的,因而查找次数要少的多。

可见,索引是用来定位的。

【主要种类】 数据库索引好比是一本书前面的目录,能SQL Server的B树结构加快数据库的查询速度。

索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。

有关数据库所支持的索引功能的详细信息,请参见数据库文档。

提示:尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。

1.唯一索引 唯一索引是不允许其中任何两行具有相同索引值的索引。

当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。

数据库还可能防止添加将在表中创建重复键值的新数据。

例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。

2.主键索引 数据库表经常有一列或多列组合,其值唯一标识表中的每一行。

该列称为表的主键。

在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。

该索引要求主键中的每个值都唯一。

当在查询中使用主键索引时,它还允许对数据的快速访问。

3.聚集索引 在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。

一个表只能包含一个聚集索引。

如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。

与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

聚集索引和非聚集索引的区别,如字典默认按字母顺序排序,读者如知道某个字的读音可根据字母顺序快速定位。

因此聚集索引和表的内容是在一起的。

如读者需查询某个生僻字,则需按字典前面的索引,举例按偏旁进行定位,找到该字对应的页数,再打开对应页数找到该字。

这种通过两个地方而查询到某个字的方式就如非聚集索引。

4.索引列 可以基于数据库表中的单列或多列创建索引。

多列索引可以区分其中一列可能有相同值的行。

如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。

例如,如果经常在同一查询中为姓和名两列设置判据,那么在这两列上创建多列索引将很有意义。

检查查询的WHERE和JOIN子句。

在任一子句中包括的每一列都是索引可以选择的对象。

对新索引进行试验以检查它对运行查询性能的影响。

考虑已在表上创建的索引数量。

最好避免在单个表上有很多索引。

检查已在表上创建的索引的定义。

最好避免包含共享列的重叠索引。

检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。

比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。

MYSQL数据库索引类型都有哪些

Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。

那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。

其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。

值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTEXT索引,要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多。

全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。

在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的,如果没有异步IO处理,进程将被挟持,很浪费时间,当然这里不对异步IO作进一步讲解,想了解的童鞋,自行谷哥。

全文索引的使用方法并不复杂: 创建ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(ame1`[ame2…]); 使用SELECT * FROM table WHERE ame1[ame2…]) AGAINST ('word' MODE ); 其中, MODE为搜寻方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。

关于这三种搜寻方式,愚安在这里也不多做交代,简单地说,就是,布尔模式,允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;自然语言模式,就是简单的单词匹配;含表达式的自然语言模式,就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。

对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。

西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。

但很明显,中文不能按照这种方式进行分词。

那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,想了解的同学请移步Mysqlcft,当然还有其他的分词插件可以使用。

HASH Hash这个词,可以说,自打我们开始码的那一天起,就开始不停地见到和使用到了。

其实,hash就是一种(key=>value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value。

正是由于这个特性,hash很适合做索引,为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据(这里在概念上和函数映射有区别,不要混淆)。

在java语言中,每个类都有自己的hashcode()方法,没有显示定义的都继承自object类,该方法使得每一个对象都是唯一的,在进行对象间equal比较,和序列化传输中起到了很重要的作用。

hash的生成方法有很多种,足可以保证hash码的唯一性,例如在MongoDB中,每一个document都有系统为其生成的唯一的objectID(包含时间戳,主机散列值,进程PID,和自增ID)也是一种hash的表现。

额,我好像扯远了-_-! 由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。

那为什么还需要其他的树形索引呢? 在这里愚安就不自己总结了。

引用下园子里其他大神的文章:来自 14的路 的MySQL的btree索引和hash索引的区别 (1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。

由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

(2)Hash 索引无法被用来避免数据的排序操作。

由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算; (3)Hash 索引不能利用部分索引键查询。

对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

(4)Hash 索引在任何时候都不能避免表扫描。

前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。

这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

数据库的索引是什么?和排序有什么区别

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

SELECT * FROM mytable WHERE id=1;

最直接的应对之道,是为 id 建立一个简单的索引~~~也就是目录~~数据库只需要去查找值为1的就行了~~

详细的信息,请看:

/view/2079871.htm#sub2079871

~

数据库索引是什么,有什么优点和缺点

创建索引可以大大提高系统的性能: 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

特网云,美国独立物理服务器 Atom d525 4G 100M 40G防御 280元/月 香港站群 E3-1200V2 8G 10M 1500元/月

特网云为您提供高速、稳定、安全、弹性的云计算服务计算、存储、监控、安全,完善的云产品满足您的一切所需,深耕云计算领域10余年;我们拥有前沿的核心技术,始终致力于为政府机构、企业组织和个人开发者提供稳定、安全、可靠、高性价比的云计算产品与服务。公司名:珠海市特网科技有限公司官方网站:https://www.56dr.com特网云为您提供高速、稳定、安全、弹性的云计算服务 计算、存储、监控、安全,完善...

Hosteons - 限时洛杉矶/达拉斯/纽约 免费升级至10G带宽 低至年$21

Hosteons,一家海外主机商成立于2018年,在之前还没有介绍和接触这个主机商,今天是有在LEB上看到有官方发送的活动主要是针对LEB的用户提供的洛杉矶、达拉斯和纽约三个机房的方案,最低年付21美元,其特点主要在于可以从1G带宽升级至10G,而且是免费的,是不是很吸引人?本来这次活动是仅仅在LEB留言提交账单ID才可以,这个感觉有点麻烦。不过看到老龚同学有拿到识别优惠码,于是就一并来分享给有需...

易探云:香港CN2云服务器低至18元/月起,183.60元/年

易探云怎么样?易探云最早是主攻香港云服务器的品牌商家,由于之前香港云服务器性价比高、稳定性不错获得了不少用户的支持。易探云推出大量香港云服务器,采用BGP、CN2线路,机房有香港九龙、香港新界、香港沙田、香港葵湾等,香港1核1G低至18元/月,183.60元/年,老站长建站推荐香港2核4G5M+10G数据盘仅799元/年,性价比超强,关键是延迟全球为50ms左右,适合国内境外外贸行业网站等,如果需...

数据库索引为你推荐
手游代理掌创互联手游代理能赚钱吗?怎么赚钱?hd4600现在英特尔hd4600显卡价格是多少blastpBLAST有什么用?为什么要BLAST?rbooracle中rbo和cbo的区别cs躲猫猫CS GO怎么玩躲猫猫diskgenius免费版diskgenius 破解版?横幅广告如何在应用中添加Admob横幅广告wizardry霍格沃茨学校在哪里?赵锡成赵锡成夫人简介微店是什么微店和淘宝网店有啥区别?
俄罗斯vps 免费申请网站域名 中国域名网 pccw godaddy域名优惠码 iis安装教程 天猫双十一抢红包 建站代码 免费ftp空间申请 免费全能空间 网通ip 本网站服务器在美国 本网站在美国维护 空间出租 国外代理服务器软件 免费美国空间 爱奇艺会员免费试用 免费私人服务器 最漂亮的qq空间 创建邮箱 更多