`
阿尔萨斯
  • 浏览: 4204965 次
社区版块
存档分类
最新评论

MySQL中主键的选择与磁盘性能

 
阅读更多

偶然看到了“Fotolog: Scaling the World's Largest Photo Blogging Community”,才发现很多数据库的优化其实道理都很简单,至高境界是当你面对问题时,是否真正做出了自己的思考,而不仅仅只是经验主义的惯性使然:

介绍:图片有很多评论。浏览时会执行:SELECT ... WHERE photo_identifier = ... ORDER BY posted ...

在“Old Schema”的解决方案中,一切都显得中规中矩:使用了最常见的自增字段identifier作为主键,同时使用photo_identifier, posted作为索引。



数据按照主键进行排序,当执行查询时,根据索引进行数据对位。不过这里的问题在于,同一个图片的评论数据,在磁盘上会分散到多个数据页之上。



在“New Schema”的解决方案中,虽然也使用了自增字段,但是采用的是联合主键photo_identifier, posted, identifier,并把identifier作为索引。同时需要注意的是,表类型使用的是Innodb,并缩减了自增字段的长度,这样,主键的长度会短一些,有助于提升Innodb的性能。


数据按照联合主键进行排序,由于photo_identifier字段是联合主键中的第一个字段,所以对于一张图片而言,它所有的评论都保存在磁盘中相邻的位置上。在这种情况下,当对数据进行定位时,Innodb会进行优化:“Pending read”,所谓Pending read,指的是当发生一次read的时候,并不一定是直接从文件系统里“物理read”,而只是从缓冲池中“逻辑read”,Innodb内部的优化机制可以合并多次“逻辑read”为一次“物理read”,从而降低IO消耗,提高磁盘性能。



还有一个问题需要考虑,当使用photo_identifier, posted, identifier联合主键时,如果对一个photo_identifier较小的图片发表评论的时候,数据会记录在比较靠前的数据页上,和直接使用identifier自增主键相比,这样会引起一个不小的IO负担,因为自增主键在添加新数据时,新数据始终位于数据文件的结尾。所以,实际应用中,文中所示的方法是否可用,还要从客观情况分析而定,比如说评论主要集中在新图片上,则IO问题不大,因为新图片的记录位于数据文件靠后的位置上,但是如果评论分布的图片比较随机的话,那么此方法是否适用则需要斟酌,不过也可以变通着来,比如说在主从服务器的结构里,我们可以在主服务器上使用identifier自增主键,在从服务器上使用photo_identifier, posted, identifier联合主键,这样既保证了写操作的效率,也保证了读操作的效率。
分享到:
评论

相关推荐

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、mysql高可用集群搭建与管理、mysql服务器性能和服务监控等方面多...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    12-为什么选择MySQL数据库即MySQL优势介绍.avi 13-MySQL数据库分类与版本升级知识讲解.avi 14-MySQL数据库商业版与社区版区别.avi 15-MySQL数据库的发布版本知识讲解.avi 16-MySQL数据库发展的三条产品线介绍.avi 17...

    MySQL各存储引擎区别与特点

    数据全部放在内存(从MYSQL5.1版本开始,可以将非索引数据放在磁盘上) 主键查找的速度极快 通过添加NDB数据存储节点可以线性地提高数据性能,是高可用、高性能的集群系统 备注说明 关于NDB存储引擎,有一个问题值得...

    mysql数据库的基本操作语法

    MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息; 约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 常用五类约束: ...

    MySQL高级面试题及答案,企业真面试题.md

    以下是一些MySQL高级面试题及答案,这些是企业真实面试中可能出现的问题: 解释一下什么是SQL优化? SQL优化是指通过调整SQL语句或数据库配置,以提高数据库的性能和响应速度。优化目标包括减少查询时间、减少磁盘I...

    MySql索引详解,索引可以大大提高MySql的检索速度

    创建索引时,你需要确保该索引是应用在SQL查询语的条件(一般作为WHERE 子句的条件)实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。上面都在说使用索引的好处,但过多的使用索引将会造成...

    MySQL常见面试题总结.pdf

    索引的优点(为什么要创建索引) 建⽴索引的不利因素(缺点), ...局部性原理与磁盘预读, B+ Tree 与 B Tree 的⽐较, 红⿊树与B+ Tree的⽐较, 全⽂索引, 联合索引, 覆盖索引, 索引使用等等。。。

    MySQL数据库:创建索引.pptx

    创建索引 数据索引 课程目标 理解 —— 创建索引的语法; 掌握 —— 在已有表上创建索引的方法;...使用列的一部分创建索引可以使索引文件大大减小,从而节省磁盘空间。BLOB或TEXT列必须用前缀索引。 创建索引

    MySql索引使用策略分析

    4.建立索引,在查询中使用索引 可以提高性能 索引缺点 1.在创建索引和维护索引 会耗费时间,随着数据量的增加而增加 2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间 3....

    java收银系统源码-MySQL:MySQL

    确定存储在列中的信息类型尝试分配最小化磁盘存储使用的数据类型,因为这样可以提高以后查询的性能。 字符, VARCHAR 整数,十进制 漂浮 日期 外键 表中的一个或多个列引用另一个表中的主键(一对多关系) 指数 提供...

    MySQL InnoDB MRR优化指南

    2、二级索引查找得到的主键的顺序是不确定的,因为二级索引的顺序与聚簇索引的顺序不一定一致; 3、如果没有 MRR,那么在聚簇索引查找时就可能出现乱序读取数据页,这对于机械硬盘是及其不友好的。 4、MRR 的优化...

    MySQL面试题从基础到高阶66问

    1. 存储结构:每个MyISAM在磁盘上存储成三个文件;InnoDB所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。 2. 事务支持:...

    MySQL索引背后的数据结构及算法原理详解

    本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文...

    MySQL 千万级数据量如何快速分页

    后端开发中为了防止一次性加载太多数据导致内存、磁盘IO都开销过大,经常需要分页展示,这个时候就需要用到MySQL的LIMIT关键字。但你以为LIMIT分页就万事大吉了么,Too young,too simple啊,LIMIT在数据量大的时候极...

    InnoDb 体系架构和特性详解 (Innodb存储引擎读书笔记总结)

    后台线程 •Master Thread 核心后台线程,主要负责将缓冲池的数据异步刷新到磁盘。...3.当脏页比例大于 innodb_max_dirty_pages_cnt, 刷新 innodb_io_capacity 个缓冲池中的脏页到磁盘。否则如果 innodb_adap

    数据库设计规范.pdf

    中⽂词汇的英语翻译可以参考常⽤术语来选择相应的英⽂词汇。 1.3 库名、表名、字段名必须是名词的复数形式,并且使⽤⼩写字母,多个名词采⽤下划线分割单词。 MySQL有配置参数lower_case_table_names=1,即库表名以...

    MySql数据库优化之SQL和索引的优化

    索引的优化是面试中数据库部分可以说是必问的问题,这个和平时的积累有关。本文详细介绍了SQL和索引的优化。     目录 1 索引的执行分析 1.1 单表的查询索引的执行过程及优化-普通查询 1.2 单表查询索引的执行过程...

    MySQL中InnoDB数据结构和索引介绍

    为何数据库中选用数据结构作为索引 数组:查询时间还行,当时插入和更新很慢。 链表:查询时间长。 hash : 定位效率高,但是没有顺序性。 树结构:B+树在查询和插入都是非常适合的 为什么选用B+Tree B+树是B-树的...

    POJOGenerator v1.3.3 Install(可视化POJO代码生成器最终版)

    知档,其中,ID列名默认使用主键名称(若为复合主键则采用次序排首位的主键列名) ,而Oracle环境下的sequence对象名称则为“seq_表名_id”格式的默认名称,请根据 实际情况修改。该配置档用于CmSdk4j-Core框架的ORM...

Global site tag (gtag.js) - Google Analytics