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

每日学习笔记(14)_MySQL

每日学习笔记(14)
1)今天在读《MySQL技术内幕InnoDB存储引擎》,作者在第四章讲到MySQL的分区时提到了一个问题,“对数据表分区真的会提高数据库的查询性能吗?”。

对于OLAP的应用,分区的确可以很好地提高查询的性能,因为OLAP应用中大多数查询需要频繁地扫描一张很大的表。假设表中数据有1亿行,其中有一个时间戳属性列。你的查询需要从这张表中获取一年的数据。如果按数据戳进行分区,则只需要扫描相应的分区就可以了。

对于OLTP 的应用,分区则应该非常小心。在这种应用下,不可能会获取一张大表中10%的数据,大部分都是通过索引返回几条记录就可以了。而根据B+树索引的原理可知,对于一张大表,一般的B+树需要2~3次得磁盘IO。因此B+树可以很好地完成操作,不需要分区的帮助,而且设计不好的分区反而会带来严重的性能问题。

假设一张表有1000万行数据,如果对主键做10个HASH的分区,那么每个分区就只有100万行数据。看上去对主键进行查询的速度是应该会变快了,例如Select * from table where PK=@pk。但是你有没有考虑过这样一个问题:100万行和1000万行的数据本身构成的B+树层次都是一样的,可能都是2层?那么上述走主键分区的索引并不会带来性能的提高。好吧,即时1000万行的B+树高度是3,100万行的B +树高度是2,那么上述方法可以避免1次IO,从而提高查询的效率。恩,这没有问题,但是这张表只有主键索引,而没有其他的列需要查询吗?如果有如下的语句:select * from table where key=@key,此时对于key的查询就需要扫描所有的10个分区,即使每个分区的查询开销为2次IO,那么也需要20次IO。而对于原来的单表设计,对于Key的查询还是2~3次IO.

因此,对于使用InnoDB存储引擎作为OLTP应用的表,在使用分区时应该十分小心,设计时要确认数据的访问模式,否则分区不仅不会带来查询速度的提高,反而可能会使你的应用执行速度变慢。

2)对于其他的一些数据库,比如SQL Server,它的表类型有一种不是索引组织表,称为堆表。这种表的特性决定了其上的索引都是非聚集的,但是堆表没有主键,所以这时书签是一个行标识符,可以用如“文件号:页号:槽号”的格式来定位实际的行。也许看上去,堆表的非聚集索引不需要再通过主键对聚集索引进行查找,那不是速度会更快吗?也许吧,在某些只读的情况下,书签为行标识符方式的非聚集索引可能会比书签为主键方式的非聚集索引快。但是考虑在OLTP应用的情况下,表可能还需要发生插入,更新,删除等DML操作。当进行这类操作时,书签为行标识符方式的非聚集索引可能需要不断更新行标识符所指向数据页的位置,此时开销可能就会大于书签为主键方式的非聚集索引了。

那为什么在 SQL Server上还要使用索引来组织表呢?堆表的书签性使得非聚集查找可疑比主键书签方式更快,并且非聚集可能在一张表中存在多个,我们需要对多个非聚集索引的查找。而且对于非聚集索引的离散读取,索引组织表上的非聚集索引会比堆表上的聚集索引慢一些。

的确,某些情况下,使用堆表的确会比索引组织表更快,但这大部分都是由于存在于OLAP的应用。其次就是前面提到的表中数据是否需要更新,并且更新是否会影响到物理地址的变更。此外另一个不能忽视的是对于排序和范围查找,索引组织表可以通过B+树的中间节点就找到要查找的所有页,然后进行读取,而堆表的特性决定了这是不可能实现的。最后,非聚集索引的离散读,的确是存在上述情况,但是一般可以通过预读技术来避免多次的离散读操作。

因此,具体是建立堆表还是索引组织表,这取决于你的应用,不存在哪个更优的情况。

作者:洞庭散人

出处:http://phinecos.cnblogs.com/    

本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
拍友2502885255
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有