数据库索引(Oracle和MySql)

索引概念

索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。建立索引是一项技术性要求高的工作。一般在数据库设计阶段得与数据库结构一起考虑。应用系统的性能直接与索引的合理直接有关。

一.Oracle索引

1.索引类型

1)非唯一索引(最常用)UonUnique。

2)唯一索引Unique。

3)位图索引Bitmap

4)分区索引Partitioned

5)非分区索引NonPartitioned

6)正常型B树Normal

7)基于函数的索引Function-based

2.索引结构

1)B-tree:

适合与大量的增、删、改(OLTP);

不能用包含OR操作符的查询;

适合高基数的列(唯一值多)

2)典型的树状结构;

每个结点都是数据块;

大多都是物理上一层、两层或三层不定,逻辑上三层;

叶子块数据是排序的,从左向右递增;

在分支块和根块中放的是索引的范围;

3)Bitmap:

适合与决策支持系统;

做UPDATE代价非常高;

非常适合OR操作符的查询;

基数比较少的时候才能建位图索引;

4)树型结构:

<1>索引头

开始ROWID,结束ROWID(先列出索引的最大范围)

<2>BITMAP

每一个BIT对应着一个ROWID,它的值是1还是0,如果是1,表示着BIT对应的ROWID有值

5)b-tree索引

Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。

6)位图索引(bitmap index)

位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况。

7)基于函数的索引

比如经常对某个字段做查询的时候是带函数操作的,那么此时建一个函数索引就有价值了。

8)分区索引和全局索引

这2个是用于分区表的时候。前者是分区内索引,后者是全表索引

9)反向索引(REVERSE)

这个索引不常见,但是特定情况特别有效,比如一个varchar(5)位字段(员工编号)含值(10001,10002,10033,10005,10016..)

这种情况默认索引分布过于密集,不能利用好服务器的并行

但是反向之后10001,20001,33001,50001,61001就有了一个很好的分布,能高效的利用好并行运算。

10)HASH索引

HASH索引可能是访问数据库中数据的最快方法,但它也有自身的缺点。集群键上不同值的数目必须在创建HASH集群之前就要知道。需要在创建HASH集群的时候指定这个值。使用HASH索引必须要使用HASH集群。

3.索引原理

若没有索引,搜索某个记录时(例如查找name=‘wish‘)需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍

若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值哪找升序排列,然后构建索引条目(name和rowid),存储到索引段中,查询name为wish时即可直接查找对应地方

创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引

4.建立索引的原则

1)如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引

2)至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)

3)小表不要简历索引

4)对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引

5)列中有很多空值,但经常查询该列上非空记录时应该建立索引

6)经常进行连接查询的列应该创建索引

7)使用create index时要将最常查询的列放在最前面

8)LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引

9)限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)

5.索引使用原则

1)经常检索排序大表中40%或非排序表7%的行,建议建索引;

2)为了改善多表关联,索引列用于联结;

3)列中的值相对比较唯一;

4)取值范围(大:B*树索引,小:位图索引);

5)Date型列一般适合基于函数的索引;

6)列中有许多空值,不适合建立索引

二.MySql索引

1.索引类型

1)单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引

2)单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。

3)普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。

4)唯一索引:索引列中的值必须是唯一的,但是允许为空值。

5)主键索引:是一种特殊的唯一索引,不允许有空值。

6)组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。这个如果还不明白,等后面举例讲解时在细说 
7)全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你是个大煞笔,二货 ..." 通过大煞笔,可能就可以找到该条记录。这里说的是可能,因为全文索引的使用涉及了很多细节,我们只需要知道这个大概意思,如果感兴趣进一步深入使用它,那么看下面测试该索引时,会给出一个博文,供大家参考。

8)空间索引:空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。

2.索引原理

在MySQL中,存储引擎用类似的方法使用索引,其先在索引中查找对应的值,然后根据匹配的索引记录找到对应的数据行,最后将数据结果集返回给客户端。

3.索引使用原则

最左前缀匹配原则

mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。比如a = 1 and b = 2 and c > 3 and d = 4,如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

=和in可以乱序

比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

尽量选择区分度高的列作为索引

区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录。

索引列不能参与计算,保持列“干净”

比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

尽量的扩展索引,不要新建索引

比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

4.高性能索引列

独立的列

前缀索引和索引的选择性

多列索引

选择合适的索引列顺序

聚簇索引

覆盖索引

使用索引扫描来做排序

冗余和重复索引

未使用的索引

原文地址:https://www.cnblogs.com/chaunqi1995/p/10117068.html

时间: 2024-11-09 07:47:17

数据库索引(Oracle和MySql)的相关文章

数据库开发 Oracle与mysql间的批量处理接口 SSIS+存储过程实现

公司目前不同的业务系统用了不同的数据库,涉及到oracle.mysql.sqlserver.而一些核心的业务在mysql中,所以平时经常要把oracle.sqlserver中的数据插入到mysql中. 这部分最开始用的是 实时接口,java实现的,不过随着mysql里业务逻辑越来越多,数据量噌噌的增长,对实时接口的响应时不时的会出问题.所以决定改用批量处理接口,每2个小时传一次数据. 废话少说,我简化了其中一块接口,画了实现的流程图.从图中直接看出我用SSIS+存储过程实现的.SSIS只用来传数

数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题(续1)

上一篇文章http://www.cnblogs.com/valiant1882331/p/4056403.html写的太长了,所以就换了一篇,链接上一节继续 字符串的拼接 MySql中可以使用"+"来拼接两个字符串. select '12'+'33',FAge+'1' from t_employee 执行完毕会输出,下面是解释:在Mysql中当用+连接两个字段的时候,Mysql会尝试将字段值转换为数字类型(如果转换失败则默认字段值为0),然后进行字段的加法运算,因此,当计算'12'+'

数据库索引-位图索引

在学习hive的时候遇到了位图索引,查了查资料.现则很难管理如下,算是个基础知识的了解吧. 一:概念介绍: 百度百科: 位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置. 当然百度百科你们懂的...来看看wiki的吧 维基百科: Bitmap indexes have traditionally bee

数据库之Oracle的使用【入门版,包括常用的Sql语句】

在命令提示符里输入sqlplus 或直接打开sqlplus scott/tiger(用户名/密码){或先输入用户名(scott)-回车-输入密码(tiger)} 1.sqlplus Orcale提供的一个客服端工具,通过使用这个工具可以发送一些sql 与数据库进行通通讯 sqlplus命令 <1>本机登录 sqlplus 用户名/密码 sqlplus 用户名 sqlplus/nolog-->启动sqlplus字符界面,然后通过conn用户 <2>查看当前用户:show use

Oracle数据库之Oracle的下载与安装

二.Oracle 的下载与安装 2.1.Oracle 简介 Oracle 公司是全球最大的信息管理软件及服务供应商,成立于 1977 年,主要的业务是推动电子商务平台的搭建.Oracle 公司有自己的服务器.数据库.开发工具.编程语言,在行业软件上还有企业资源计划(ERP)软件.客户关系管理(CRM)软件.人力资源管理软件(HCM)等大型管理系统,所以 Oracle 是一家综合性的国际大公司,也是最有实力与微软公司在技术上一较高低的公司之一. Oracle 公司的创办决定于4位传奇人物(左起):

数据库笔试面试题库(Oracle、MySQL等)

数据库笔试面试题库(Oracle.MySQL等) ⊙ [DB笔试面试67]在Oracle中,关于表分区下列描述不正确的是()⊙ [DB笔试面试65]在Oracle中,哪一种表分区方式建议的分区数是2的幂(2.4.8等),以获得最平均的数据发布()⊙ [DB笔试面试63]要以NAME's address is ADDR格式返回数据,以下SQL语句正确的是⊙ [DB笔试面试61]以下关于数据模型要求错误的是()⊙ [DB笔试面试59]以下关于视图叙述不正确的是()⊙ [DB笔试面试57]下列关于SQ

如何正确建立MYSQL数据库索引

索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  );   我们随机向里面插入了10000条记录,其中有一条:5555, admin. 在查找username="admin"的记录

C#连接Access、SQL Server、Oracle、MySQL、DB2和SyBase数据库的代码集

C#连接六类数据库的代码集 本文列出了C#连接Access.SQL Server.Oracle.MySQL.DB2和SyBase六种不同数据库的程序源码和需要注意的点. 1.C#连接Access 程序代码: Code using System.Data;using System.Data.OleDb; .. string strConnection="Provider=Microsoft.Jet.OleDb.4.0;"; strConnection+[email protected]&

mysql 迁移数据库到 oracle (sql注意问题)

http://ykdn2010.iteye.com/blog/1511349 一. 项目已用到 oracle 函数的转换 1.  Oracle 中的 TO_DATE (),TO_CHAR () 示例: select * from admadjustmoney t where t.sendtime> to_date(?,'yyyy-mm-dd      hh24:mi:ss') and t.sendtime< to_date(?,'yyyy-mm-dd hh24:mi:ss') 转换后: SEL