索引的定义 什么是资料库索引 有哪些型别和特点
什么是资料库索引 有哪些型别和特点
什么是资料库索引 有哪些型别和特点
索引类似于咱们日常生活中的字典。它是储存在块里,储存每行资料的实体地址,与被建立的索引列的资料一一对应,用来快速定位,最快找到资料。但是并不是说用索引就一定可以提高效能。
资料库索引的作用相当于书的目录,就是提高资料的查询速度,不同的资料库索引型别不用,比如SQL SERVER就有聚集索引和非聚集索引,聚集索引提高资料的查询速度,非聚集索引对提高查询速度不利,但可以提高资料的删除或插入速度,因为它的逻辑页面和物理页面不一致
MYSQL资料库索引型别都有哪些
主要有这些:
PRIMARY, INDEX, UNIQUE 这3种是一类
PRIMARY 主键。 就是 唯一 且 不能为空。
INDEX 索引,普通的
UNIQUE 唯一索引。 不允许有重复。
FULLTEXT 是全文索引,用于在一篇文章中,检索文字资讯的。

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 MATCH(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 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表资料的访问,而造成整体效能低下。
资料库索引优缺点有哪些?
建立索引可以大大提高系统的效能:
第一,通过建立唯一性索引,可以保证资料库表中每一行资料的唯一性。
第二,可以大大加快资料的检索速度,这也是建立索引的最主要的原因。
第三,可以加速表和表之间的连线,特别是在实现资料的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行资料检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的效能。
增加索引也有许多不利的方面:
第一,建立索引和维护索引要耗费时间,这种时间随着资料量的增加而增加。
第二,索引需要占物理空间,除了资料表占资料空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的资料进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了资料的维护速度。
索引是建立在资料库表中的某些列的上面。因此,在建立索引的时候,应该仔细考虑在哪些列上可以建立索引,在哪些列上不能建立索引。一般来说,应该在这些列上建立索引,例如:
在经常需要搜寻的列上,可以加快搜索的速度;
在作为主键的列上,强制该列的唯一性和组织表中资料的排列结构;
在经常用在连线的列上,这 些列主要是一些外来键,可以加快连线的速度;
在经常需要根据范围进行搜寻的列上建立索引,因为索引已经排序,其指定的范围是连续的;
在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
在经常使用在WHERE子句中的列上面建立索引,加快条件的判断速度。
什么是资料库索引,如何设计索引以优化资料库查询效能
1、主键就是聚集索引
2、只要建立索引就能显著提高查询速度
3、把所有需要提高查询速度的栏位都加进聚集索引,以提高查询速度
(四)其他书上没有的索引使用经验总结
1、用聚合索引比用不是聚合索引的主键速度快
2、用聚合索引比用一般的主键作order by时速度快,特别是在小资料量情况下
3、使用聚合索引内的时间段,搜寻时间会按资料占整个资料表的百分比成比例减少,而无论聚合索引使用了多少个
4 、日期列不会因为有分秒的输入而减慢查询速度
(五)其他注意事项
1. 不要索引常用的小型表
2. 不要把社会保障号码(SSN)或身份证号码(ID)选作键
3. 不要用使用者的键
4. 不要索引 memo/notes 栏位和不要索引大型文字栏位(许多字元)
5. 使用系统生成的主键
二、改善SQL语句
1、Like语句是否属于SARG取决于所使用的万用字元的型别
2、or 会引起全表扫描
3、非操作符、函式引起的不满足SARG形式的语句
4、IN 的作用相当与OR
5、尽量少用NOT
6、exists 和 in 的执行效率是一样的
7、用函式charindex()和前面加万用字元%的LIKE执行效率一样
8、union并不绝对比or的执行效率高
9、栏位提取要按照“需多少、提多少”的原则,避免“select *”
10、count(*)不比count(栏位)慢
11、order by按聚集索引列排序效率最高
12、高效的TOP
资料库索引超出范围
你看看你的资料库里面一共几列,比如一共有4列,你提交的表有5咧,那就不行了
资料库有可能是你原先建立,然后你增加了属性,资料库还是老的,你给资料库删了重建试试
资料库索引失效怎么办
看 user_indexes 的 status 栏位, 如果不是 valid, 索引失效。
在使用分割槽表情况下,可能出现索引失效。
如果索引失效,需要重建索引。
Oracle资料库索引知多少
索引的作用
支援快速查询
对于储存大量资料的资料库,线性查询效率很低,索引技术使资料库支援次线性时间查询以提高查询效能。索引是所有提高查询效能的资料结构。目前已经有许多资料结构可用于提高查询速度,事实上电脑科学领域的研究有很大一部分工作是对索引资料结构的研究和分析。索引资料结构的研究需要考虑查询效能、索引大小和索引更新效能等方面的折中。许多索引提供对数时间复杂度(O(logn(N)))的查询效能,某些情况下甚至可以获得O(1)时间复杂度。
实现资料库约束
索引也可以用于实现资料库的约束,如UNIQUE,EXCLUSION,PRIMARY KEY和FOREIGN KEY。UNIQUE索引约束其所引用的列,该列的值唯一。资料库系统通常会预设在PRIMARY KEY(主键)的列上建立索引。
MySQL中有哪些情况下资料库索引会失效详析
oracle可以使用强制索引,举个例子
比如在条件诸多的sql中为了确保优先正确的使用最高效的索引可以这样写
select * from table_name a where col_a=? and col_b=? and col_c=? and ...;
注意() 里面的a如果表有别名要用别名如果没有就用表名,这样就会强制使用你想要用的索引了。