索引

SqlServer索引的原理与应用

孤人 提交于 2020-03-18 20:05:35
索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法。 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书。在数据库中,数据库程序使用索 引可以重啊到表中的数据,而不必扫描整个表。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表。 索引的利弊:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读取表的每一个数据页,如果有 索引指向数据值,则查询只需要读少数次的磁盘就行啦。所以合理的使用索引能加速数据的查询。但是索引并不总是提高系统的性能,带索引的表需要在数 据库中占用更多的存储空间,同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长。所以我们要合理使用索引,及时更新去除次优索引。 数据表的基本结构 一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个 8K用完的时候,数据库指针会自动分配一个8K的空间。这里,每个8K空间被称为一个数据页(Page),又名页面或数据页面,并分配从0-7的页号, 每个文件的第0页记录引导信息,叫文件头(File header);每8个数据页

Oracle系列之索引

蓝咒 提交于 2020-03-18 19:49:37
涉及到表的处理请参看原表结构与数据 Oracle建表插数据等等 Oracle索引、权限 介绍 为什么添加了索引后,会加快查询速度呢? 索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低i/o次数,从而提高数据访问性能。索引有很多种我们主要介绍常用的几种 创建索引 单列(唯一)索引 单列索引是基于单个列所建立的索引,比如: create unique index index_name on table_name(column_name); 复合索引 复合索引是基于两列或是多列的索引。在同一张表上可以有多个索引,但是要求列的组合必须不同,比如: create index emp_index on tb_Employee(ename, job); 使用原则 1. 在大表上建立索引才有意义 2. 在where子句或是连接条件上经常引用的列上建立索引 3. 索引的层次不要超过4层 索引的缺点 索引缺点分析 索引有一些先天不足: 1. 建立索引,系统要占用大约为表1.2倍的硬盘和内存空间来保存索引。 2. 更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性。 实践表明,不恰当的索引不但于事无补,反而会降低系统性能。因为大量的索引在进行插入、修改和删除操作时比没有索引花费更多的系统时间。比如在如下字段建立索引应该是不恰当的: 1. 很少或从不引用的字段

Oracle分区表常用命令

老子叫甜甜 提交于 2020-03-18 19:39:52
一、Oracle分区简介 ORACLE的分区是一种处理超大型表、索引等的技术。分区是一种“分而治之”的技术,通过将大表和索引分成可以管理的小块,从而避免了对每个表作为一个大的、单独的对象进行管理,为大量数据提供了可伸缩的性能。分区通过将操作分配给更小的存储单元,减少了需要进行管理操作的时间,并通过增强的并行处理提高了性能,通过屏蔽故障数据的分区,还增加了可用性。 二、Oracle分区优缺点 ? 优点: 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能; 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。 ? 缺点: 分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。 三、Oracle分区方法 ? 范围分区: 范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。如根据序号分区,根据业务记录的创建日期进行分区等。 ? Hash分区(散列分区): 散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。 ? List分区(列表分区):

MySQL(一)索引的创建和删除

佐手、 提交于 2020-03-18 19:36:14
索引是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。接下来将讲述如何创建、查看和删除索引。 索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。 目录 一、索引类别 二、创建索引 1.ALTER TABLE 2.CREATE INDEX 三、 删除索引 四、查看索引 五、建立索引的时机 六、索引的不足之处 七、使用索引的注意事项 执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。 一、索引类别 普通索引 这是最基本的索引,它没有任何限制 唯一索引(UNIQUE索引) 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一 主键索引(PRIMARY KEY) 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引 组合索引

关于分区表和分区索引

人盡茶涼 提交于 2020-03-18 19:34:14
关于 分区表 和 分区索引 (About Partitioned Tables and Indexes) 对于10gR2而言,基本上可以分成几类: v Range(范围)分区 v Hash(哈希)分区 v List(列表)分区 v 以及组合分区:Range-Hash,Range-List。 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列不能是lob,long之类数据类型,每个表的分区或子分区数的总数不能超过1023个。 对于索引组织表,只能够支持普通分区方式,不支持组合分区,常规表的限制对于索引组织表同样有效,除此之外呢,还有一些其实的限制,比如要求索引组织表的分区依赖列必须是主键才可以等。 注:本篇所有示例仅针对常规表,即堆组织表! 对于索引,需要区分创建的是全局索引,或本地索引: l 全局索引(global index):即可以分区,也可以不分区。即可以建range分区,也可以建hash分区,即可建于分区表,又可创建于非分区表上,就是说,全局索引是完全独立的,因此它也需要我们更多的维护操作。 l 本地索引(local index):其分区形式与表的分区完全相同,依赖列相同,存储属性也相同。对于本地索引,其索引分区的维护自动进行,就是说你add/drop/split/truncate表的分区时

MySQL执行计划extra中的using index 和 using where using index 的区别

喜夏-厌秋 提交于 2020-03-18 18:52:53
本文出处: http://www.cnblogs.com/wy123/p/7366486.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) mysql执行计划中的extra列中表明了执行计划的每一步中的实现细节,其中包含了与索引相关的一些细节信息 其中跟索引有关的using index 在不同的情况下会出现Using index, Using where Using index ,Using index condition等 那么Using index 和 Using where;Using index 有什么区别?网上搜了一大把文章,说实在话也没怎么弄懂,于是就自己动手试试。 本文仅从最简单的单表去测试using index 和 using where using index以及简单测试using index condition的情况的出现时机 。 执行计划的生成与表结构,表数据量,索引结构,统计信息等等上下文等多种环境有关,无法一概而论,复杂情况另论。 测试环境搭建   测试表以及测试数据搭建,类似于订单表和订单明细表,暂时先用订单表做测试   测试表结构 create table test_order ( id int auto_increment primary key, user_id

mysql explain解析一 extra中的using index,using where,using index condition

不羁岁月 提交于 2020-03-18 18:52:19
1.简单介绍 using index 和using where只要使用了索引我们基本都能经常看到,而using index condition则是在mysql5.6后新加的新特性,我们先来看看mysql文档对using index condition的描述 附上mysql文档链接:https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html 简单来说,mysql开启了ICP的话,可以减少存储引擎访问基表的次数 下面来简单的介绍一下这三者的区别 using index :使用覆盖索引的时候就会出现 using where:在查找使用索引的情况下,需要回表去查询所需的数据 using index condition:查找使用了索引,但是需要回表查询数据 using index & using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据 以上四点就能看出它们之前的区别,或许有部分人都存在疑惑 using index & using where 和using index condition那个比较好,从上面的的解释中就能看出是前者比较好,毕竟不需要回表查询数据,效率上应该比较快的 下面是在stackoverflow中找到的答案:

mysql复习相关

纵然是瞬间 提交于 2020-03-18 18:50:28
Mysql相关 mysql增删改查 我们需要修改数据表名或者修改数据表字段时,就需要使用到Mysql Alter命令 删除,添加或修改表字段 alter table student drop register_date; #从student表删除register_date alter table student add phone int(11) not null; #添加phone字段 修改字段类型及名称 如果需要修改字段类型及名称,你可以在alter命令中使用Modify或change 例如:把字段c的类型从char(1)改为char(10),可以执行以下命令: alter table testalter_tbl modigy c char(10); 使用change子句,语法有很大的不同。在change关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。 alter table testalter_tbl change i j BIGINT; alter table testalter_tbl change j j int; alter table对null值和默认值的影响 当你修改字段时,你可以指定是否包含只或者是否设置默认值 以下实例,指定字段j为not null且默认值为100 alter table testalter_tbl modify j

MySQL优化-filesort-Using index condition

五迷三道 提交于 2020-03-18 18:45:32
首先要明白SQL的运行流程,方便理解。 http://blog.itpub.net/22664653/viewspace-1210844/ https://tech.meituan.com/mysql-index.html 阿里大神: https://yq.aliyun.com/topic/100?spm=5176.8217306.rtdmain.3.vmqTwp ICP 关闭时 ,仅仅使用索引作为访问数据的方式。 ICP 开启时 ,MySQL将在存储引擎层 利用索引过滤数据,减少不必要的回表,注意 虚线的using where 表示 如果where条件中含有没有被索引的字段,则还是要经过MySQL Server 层过滤。 ################# sending data 存储引擎搜集数据发送到客户端。 ################ filesort https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html ################# num1 是辅助索引 num2 是唯一索引 id是主键 desc select id,num1 from a where num1=2 order by id; ######考点是二级索引的叶子节点包含主键,不需要回表,(num1,id)是逻辑有序的

mysql left join没有使用索引原因排查。

旧城冷巷雨未停 提交于 2020-03-18 14:49:27
某厂面试归来,发现自己落伍了!>>> 问题: 项目使用Activiti进行工单业务开发时 ,将 历史任务实例表( act_hi_taskinst )和催单记录表(tbl_urgency_recd)进行left join关联开发时,发现已经建了索引,但是执行计划里显示没有使用索引。 原因: 所有的关联的字段的字符集不一样,导致无法使用索引。 具体过程如下: SQL的执行计划: Extra列,Range checked for each record (index map: 0x2)的意思为没有合适的索引可用。以下为《高性能MySQL》一书的解释: 但是,两个表对应的字段都是建有索引: act_hi_taskinst : tbl_urgency_recd: 查看两个表的字段属性: tbl_urgency_recd: act_hi_taskinst: tbl_urgency_recd表字段task_id字符集为:utf8_general_ci。 act_hi_taskinst表字段ID_的字符集为:utf8_bin。 将tbl_urgency_recd表字段task_id字符集修改为:utf8_bin。 修改完,再执行explain,结果入下。 显示,已使用索引,关联类型(type)由ALL(全表扫秒)变为ref(索引访问)。 另外,在这记录下mysql的常见字符集区别,用以备查: