- 浏览: 230989 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hl174:
写的不错,赞一个
在Java中字节与十六进制的相互转换主要思想有两点 -
l540151663:
也是个好方法
String为空判断
数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下:
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。
那么在什么时候适合加上索引呢?我们看一个Mysql手册中举的例子,这里有一条sql语句:
SELECT c.companyID, c.companyName FROM Companies c, User u WHERE c.companyID = u.fk_companyID AND c.numEmployees >= 0 AND c.companyName LIKE '%i%' AND u.groupID IN (SELECT g.groupID FROM Groups g WHERE g.groupLabel = '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树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略,毕竟在数据库战场上,搜索速度和管理安全一样是非常重要的竞争点。
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。
那么在什么时候适合加上索引呢?我们看一个Mysql手册中举的例子,这里有一条sql语句:
SELECT c.companyID, c.companyName FROM Companies c, User u WHERE c.companyID = u.fk_companyID AND c.numEmployees >= 0 AND c.companyName LIKE '%i%' AND u.groupID IN (SELECT g.groupID FROM Groups g WHERE g.groupLabel = '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树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略,毕竟在数据库战场上,搜索速度和管理安全一样是非常重要的竞争点。
发表评论
-
Access denied for user 'root'@'localhost' (using password:YES)
2018-11-07 14:26 599这两天在MyEclipse中开发Web项目时,连接MYSQL数 ... -
PowerDesigner导入sql脚本生成物理模型
2017-12-05 11:17 817(1)首先从sqlserver中生成脚本 (2)打开Power ... -
mysql 2006
2017-10-12 11:30 537当查询的结果集超过 max_allowed_packet 也会 ... -
修改myslq自动增长的ID数值
2017-10-10 10:30 496ALTER TABLE basic_object AUTO_ ... -
mysql 创建用户付权限及导出
2017-03-25 22:34 5981:创建用户,付权限 C:\soft\mysql\MySQL ... -
mysql 修改data的位置目录
2017-03-21 09:52 446具体操作: 一、停止MySQL 开始-cmd ne ... -
sql效率问题
2017-03-07 14:14 4871.关于SQL查询效率,100w数据,查询只要1秒,与您分享: ... -
mysql 创建用户付权限
2016-12-13 17:07 579连接数据库 mysql -u root -p 回车 ro ... -
mysql 触发器
2016-11-28 22:32 453直接在navicat.exe中设计表中的,触发器中添加 1: ... -
CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause问题
2016-11-24 11:44 444修改的最简单的办法,都把timestamp 设置为 可以为nu ... -
mysql 同行求最大最小值
2016-11-13 20:43 621SELECT GREATEST(3,5,1,8,33,99,3 ... -
redis总结一
2016-11-05 16:30 471http://edu.51cto.com/lesson/id- ... -
mysql合理配置连接池数量
2016-10-28 17:40 1175http://www.th7.cn/db/mysql/2015 ... -
mysql 存储过程例子
2016-10-28 16:11 552BEGIN DECLARE ishave int DEFAU ... -
mysql用命令备份数据库
2016-08-08 22:33 6131:导出数据库,主要用管理员身份运行cmd c:\Progra ... -
mysql 日期函数
2016-06-30 16:05 4141:查询年月日 select year(now()); sel ... -
mongodb总结1
2016-06-19 11:39 6091:登陆进入bin目录下( ... -
mysql保留2位小数查询
2016-06-15 18:54 1627SELECT T1. NAME, ... -
in8 win10 安装msi 提示2502、2503的错误代码
2016-05-02 17:09 706版权声明:本文为博主原创文章,未经博主允许不得转载。 ... -
mysql总结1
2016-04-24 21:41 4831:连接数据库 mysql -u root -p 回车 ...
相关推荐
### 浅谈Oracle中重建索引 #### 一、索引的基本概念与作用 在数据库管理系统(DBMS)中,索引是一种特殊的数据结构,它能够加速数据检索的速度。Oracle数据库同样提供了强大的索引功能来优化查询性能。索引通过在...
自己整理有关MySQL的索引失效相关的信息,重点在组合索引的失效,有兴趣可以看看,看看是否对你有些许帮助
浅谈Oracle中索引的使用.pdf
### 浅谈MYSQL中的索引优化 #### 一、MySQL中的索引与B+树 在MySQL数据库系统中,索引被广泛应用于提高数据检索的效率。索引本质上是一种数据结构,它允许用户快速定位数据库中的记录。在MySQL中,B+树是最常见的...
缓存利用索引(Index)找到数据所在的行,使用标签验证数据的正确性。缓存块的替换算法用来决定当缓存已满时,新信息应该如何置换已存储的信息。 在x86架构中,常见的缓存层次包括一级缓存(L1 Cache)、二级缓存...
本文主要探讨的是基于索引的SQL语句优化方法,旨在帮助读者深入理解如何利用索引来提高查询效率。索引是数据库管理系统中的一个重要概念,它能显著加速数据检索过程,尤其是在处理大量数据时。 一、索引的基本原理 ...
在数据库管理系统中,索引是一种用于快速定位数据记录的工具,它在数据的逻辑结构基础上建立了一种物理结构,从而提高了数据查询的速度和效率。SQL Server是微软公司推出的关系型数据库管理系统,其提供了两种类型的...
SQL Server中索引的使用是数据库性能优化的一个重要方面,它直接影响到数据查询和处理的效率。索引就像书籍的目录,能帮助数据库快速定位到数据所在的位置,从而加快查询速度。在实际应用中,索引的使用要非常慎重,...
【SQL Server 2012列存储索引技术】 SQL Server 2012 引入了一种创新的索引技术——列存储索引,它显著提升了数据仓库的查询性能,尤其是在决策支持类查询中,可以实现大约10倍的性能提升。列存储索引的核心理念...
此外,索引虽然能够加速查询操作,但也会增加写操作的成本,例如INSERT、UPDATE、DELETE等操作,在创建索引之后会变得更慢,因为索引也需要随之更新。 在进行索引优化时,还要注意以下几点: - 对于数据更新频繁的...
《Oracle 索引管理秘密,顶级专家谈索引管理技巧》这本书汇集了Oracle领域内多位顶级专家的经验与智慧,不仅深入浅出地讲解了索引管理的基础知识,还提供了大量实用的操作指南和最佳实践案例。无论是对于初学者还是...
标题:“浅谈jQuery的应用” 知识点: 1. jQuery简介:jQuery是一个继prototype之后的优秀JavaScript框架,由John Resig创建于2006年初。它简化了JavaScript以及Ajax编程,以“write less, do more”为宗旨,用更...
聚集索引类似于字典的拼音索引,它决定了表中数据的物理存储顺序,因此对于查询来说,如果涉及到表中的大部分或全部数据,则聚集索引非常有效。非聚集索引则类似于字典的部首索引,它不会影响表数据的物理存储顺序,...
UTF-32则是每个字符固定使用四个字节,尽管它在存储空间上较为浪费,但提供了最简单的字符索引和处理。 Unicode的出现并非一蹴而就,而是逐步取代了许多早期的编码标准。例如,Windows操作系统在NT 3.1版本之后就...
1.什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 例如这样一个查询:select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引...
MySQL的MyISAM、InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题:为什么MySQL等主流数据库选择B+树的索引结构?如何基于索引结构,理解常见的MySQL索引优化思路?索引结构的选择基于...
【MySQL InnoDB 索引页结构】 InnoDB存储引擎的索引是基于B树(B+Tree)实现的,无论是主键还是辅助键。索引页,也称为页节点,是InnoDB存储索引记录的基本单位,其默认大小为16KB。当新记录插入时,InnoDB会保留1/...
MySQL的索引设计是数据库优化的关键环节,它直接影响到数据查询的效率。下面将详细讨论索引设计原则以及常见索引的区别。 首先,选择唯一性索引是非常重要的原则。唯一性索引确保了索引项的唯一性,有助于快速定位...
DBA应监控慢查询,通过编写更高效的查询语句、创建合适索引、避免全表扫描、使用绑定变量等方式提高SQL执行效率。 【总结】 Oracle数据库的性能优化是一个综合性的任务,涉及内存管理、磁盘I/O、CPU使用和SQL优化...
数据库索引是数据库管理系统中用于加速查询的一种数据结构,它的主要目标是减少数据检索的时间,提高查询效率。本文将深入探讨数据库索引的作用、原理以及何时适合创建索引。 首先,索引的作用在于通过减少全表扫描...