热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

DatabaseIndices_MySQL

DatabaseIndices
数据库table的index是建立在一个或多个column上的一个数据结构, 选定的一个或若干个column称作index的key, 用来加快相应key所对应的record(tuple)的定位.

从数据结构的角度来看, 索引是一个map, 将key映射到对应的record的指针. 索引能提供更好的查找性能, 关键之处在于, 一个block可以存储的(key, pointer_to_record)是可以很多的, 要远大于一个block存储的record的个数, 这意味着查找过程中磁盘io可以大大减少.索引可以分为dense index和sparse index, 前者对于每个record都建立索引, 后者只对一个block上存储的多个record中的某一个(如第一个)建立索引.

最直接的构建索引想法就是将key所在的column提取出来, 排序之后存储起来即可. 之后, 查找过程就可以二分来进行. 如果索引本身也比较大, 那进一步可以对索引再做索引, 沿着这个思路走下去, 就得到了B树了, 下图是一棵B+树.

Non-clusteredIndex:record本身不按照该index排序(当然, index内的key是排序的), 只不过index内的指针指向了不同的record位置.

ClusteredIndex:record按照该index的key来排序, 即存储在data block里面的record是按照这个index排序的. 换句话说,这个index的key决定了record是如何存储的.

实例分析

MicrosoftSQL Server 2000

1, 如何创建index,参见http://msdn.microsoft.com/en-us/library/aa258260(v=SQL.80).aspx

2, SQL Server 2000中(后续版本未确认), 如果没有创建 clustered index, 创建primary key的时候会自动创建clustered index. 更多关于clustered index, 参见

3, clustered index与non-clusteredindex都是用B-tree实现的, 参见http://msdn.microsoft.com/en-us/library/aa174523(v=SQL.80).aspx

与http://msdn.microsoft.com/en-us/library/aa174537(v=SQL.80).aspx

4, Non-clustered index中, 如果这张表有clustered index, non-clustered index的pointer存储的是clustered index key (因此clustered index key应该尽量小).

MySQLInnoDB & MyISAM

InnoDB的做法和上面提到的SQL Server的做法差不多:索引都是B树, 用primary key当clustered index, secondary-index中的recordlocator是clustered index key等. 稍有不同的是, InnoDB在没有合适的column充当cluster key的时候, 会自动创建一个column来作为cluster index key column, 参见http://dev.mysql.com/doc/refman/5.5/en/innodb-index-types.html

MySQL的另一个存储引擎, MyISAM, 做法就土了. MyISAM中, 没有clusteredindex, 所有的record locator都直接指向record的位置. InnoDB与MyISAM在index上的对比参见http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

ClusteredIndex与record的插入

Clustered Index要求record按照cluster index key的值来排序, 因此, 插入过程首先是一个查找的过程, 找到对应的位置以后, 除了在data block中插入这个record(可能要引起block split, 因为这个block快满了), 还要在index里也插入这个key,同样也可能引起block split.

同理, 删除的时候也会有这样的问题.

也正是这个原因, SQL Server和InnoDB的secondary index的record locator存储的都是clustered index key, 这样, secondary index就独立出去了, 不用每次更新都要更新所有的index. 代价是secondary index查完以后, 还要再拿得到的key再走一遍clusteredindex, 不过clustered index基本上都在内存里面了, 而且就是用来做快速访问的(良好优化过了), 所以仍然是值得的.

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 数据库(外键及其约束理解)(https:www.cnblogs.comchenxiaoheip6909318.html)My ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • yum安装_Redis —yum安装全过程
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Redis—yum安装全过程相关的知识,希望对你有一定的参考价值。访问https://redi ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
VE5851_325
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有