聚集索引:
该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
如果用 新华字典 作例子来一个例子的话。
[拼音]就可以看作是聚集索引
例如 吖、阿、啊 在字典的最前面。
左、作、坐 在字典的最后面。
拼音[逻辑顺序]很接近,在字典中页数的位置[物理顺序]也很接近。
适用场合:
含有大量非重复值的列
使用BETWEEN,>,>=,<或<=返回一个范围值的列
被连续访问的列
返回大型结果集的查询
经常被使用连接或GROUP BY子句的查询访问的列
非聚集索引:
非聚集索引与聚集索引一样有 B 树结构,但是有两个重大差别:
数据行不按非聚集索引键的顺序排序和存储。
非聚集索引的叶层不包含数据页。
相反,叶节点包含索引行。每个索引行包含非聚集键值以及一个或多个行定位器,
这些行定位器指向有该键值的数据行(如果索引不唯一,则可能是多行)。
如果用 新华字典 作例子来一个例子的话。
[笔画]就可以看作是非聚集索引
例如 化 仇 仃 仅 仂 这几个字,都是 单人旁,笔画数相同的。
笔画[逻辑顺序]很接近,在字典中页数的位置[物理顺序]则在不同的位置上。
适用场合:
含有大量非重复值的列
非连续访问的列
返回小型结果集的查询
select from 表名 here 字段名 in (select max(字段名) from 表名)
后一个问题,看什么数据库,看怎么使用,你这么问的话没法回答
数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下: 首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。 那么在什么时候适合加上索引呢?我们看一个Mysql手册中举的例子,这里有一条sql语句: SELECT ccompanyID, ccompanyName FROM Companies c, User u WHERE ccompanyID = ufk_companyID AND cnumEmployees >= 0 AND ccompanyName LIKE '%i%' AND ugroupID IN (SELECT ggroupID FROM Groups g WHERE ggroupLabel = 'Executive') 这条语句涉及3个表的联接,并且包括了许多搜索条件比如大小比较,Like匹配等。在没有索引的情况下Mysql需要执行的扫描行数是77721876行。而我们通过在companyID和groupLabel两个字段上加上索引之后,扫描的行数只需要134行。在Mysql中可以通过Explain Select来查看扫描次数。可以看出来在这种联表和复杂搜索条件的情况下,索引带来的性能提升远比它所占据的磁盘空间要重要得多。 那么索引是如何实现的呢?大多数DB厂商实现索引都是基于一种数据结构——B树。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表。B树的定义是这样的:一棵m(m>=3)阶的B树是满足下列条件的m叉树: 1、每个结点包括如下作用域(j, p0, k1, p1, k2, p2, ki, pi) 其中j是关键字个数,p是孩子指针 2、所有叶子结点在同一层上,层数等于树高h 3、每个非根结点包含的关键字个数满足[m/2-1]<=j<=m-1 4、若树非空,则根至少有1个关键字,若根非叶子,则至少有2棵子树,至多有m棵子树 看一个B树的例子,针对26个英文字母的B树可以这样构造: 可以看到在这棵B树搜索英文字母复杂度只为o(m),在数据量比较大的情况下,这样的结构可以大大增加查询速度。然而有另外一种数据结构查询的虚度比B树更快——散列表。Hash表的定义是这样的:设所有可能出现的关键字集合为u,实际发生存储的关键字记为k,而|k|比|u|小很多。散列方法是通过散列函数h将u映射到表T[0,m-1]的下标上,这样u中的关键字为变量,以h为函数运算结果即为相应结点的存储地址。从而达到可以在o(1)的时间内完成查找。
然而散列表有一个缺陷,那就是散列冲突,即两个关键字通过散列函数计算出了相同的结果。设m和n分别表示散列表的长度和填满的结点数,n/m为散列表的填装因子,因子越大,表示散列冲突的机会越大。
因为有这样的缺陷,所以数据库不会使用散列表来做为索引的默认实现,Mysql宣称会根据执行查询格式尝试将基于磁盘的B树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略,毕竟在数据库战场上,搜索速度和管理安全一样是非常重要的竞争点。
不同的数据库管理系统可能不一样
但是可以肯定都不用select。
它是在创建数据库表,或者修改数据库表时使用相应语句。
例如MySQL
用类似语句
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
table_name为相应数据库表名
index_name为索引名
column为数据库表中创建索引的字段。
普通索引:允许被索引的数据列包含重复的值。
唯一索引:可以保证数据记录的唯一性。
主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARY KEY来创建。
联合索引:索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引。
全文索引:通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术。可以通过ALTER TABLE table_name ADD FULLTEXT (column;创建全文索引
索引可以极大的提高数据的查询速度。
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
但是会降低插入、删除、更新表的速度,因为在执行这些写 *** 作时,还要 *** 作索引文件
索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大,如果非聚集索引很多,一旦聚集索引改变, 那么所有非聚集索引都会跟着变。
联合索引最左匹配原则
字段添加索引的语句可以百度找 mysql 添加索引命令。
索引的好处在于可以讲指定列进行排序,提高检索的速度。
一个简单的例子:
某个列的数据是
id name
12 小李
10 小龙
5 小青
99 小红
id列创建索引后就会生成一个索引表
id index
5 3
10 2
12 1
99 4
当查询 where id =10的 时候,使用到索引表。由于10下面是15,不可能有大于10的数。所以不再进行扫描表 *** 作。返回第二条数据,对应回主表的第二行。
这样就提高了查询的速度,如果没添加索引;则扫描整张主表。
索引的类型,什么列需要加索引等相关信息的你还需百度查询一下,这里告诉你的是一些基本的概念。
以上就是关于数据库索引的相关问题全部的内容,包括:数据库索引的相关问题、数据库索引相关、数据库索引有什么作用和好处等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)