高性能mysql第三版和第四版区别

4小时前 (00:40:05)阅读1回复0
dyyh
dyyh
  • 管理员
  • 注册排名7
  • 经验值123560
  • 级别管理员
  • 主题24712
  • 回复0
楼主
1、高性能MySQL:字符串类型(1) 2、MySQL高性能SQL重视 事项简述 3、高性能MySQL:只修改.frm 文件 高性能MySQL:字符串类型(1)

字符串类型( )

MySQL 撑持多种字符串类型 每品种型还有良多变种 那些数据类型在 和 版本发作了很大的改变 使得情状 愈加复杂 从MySQL 起头 每个字符串列能够定义本身的字符集和排序规则 或者说校对规则(collation)(更多关于那个主题的信息请参考第 章) 那些工具会很大水平上影响性能

VARCHAR 和CHAR 类型

VARCHAR 和CHAR 是两种最次要的字符串类型 不幸的是 很难切确地阐明 那些值是怎么存储在磁盘和内存中的 因为那跟存储引擎的详细实现有关 下面的描述假设利用的存储引擎是InnoDB 和/ 或者MyISAM 假设 利用的不是那两种存储引擎 请参考所利用的存储引擎的文档

先看看VARCHAR 和CHAR 值凡是在磁盘上怎么存储 请重视 存储引擎存储CHAR 或者VARCHAR 值的体例在内存中和在磁盘上可能纷歧样 所以MySQL 办事器从存储引擎读出的值可能需要转换为另一种存储格局 下面是关于两品种型的一些比力

VARCHAR

VARCHAR 类型用于存储可变长字符串 是最常见的字符串数据类型 它比定长类型更节约 空间 因为它仅利用需要的空间(例如 越短的字符串利用越少的空间) 有一种情状 破例 假设 MySQL 表利用ROW_FORMAT=FIXED 创建的话 每一个城市利用定长存储 那会很浪费空间

VARCHAR 需要利用 或 个额外字节笔录 字符串的长度 假设 列的更大长度小于或等于 字节 则只利用 个字节表达 不然利用 个字节 假设摘 用latin 字符集 一个VARCHAR( ) 的列需要 个字节的存储空间 VARCHAR( ) 的列则需要 个字节 因为需要 个字节存储长度信息

VARCHAR 节约 了存储空间 所以对性能也有搀扶帮助 但是 因为行是变长的 在UPDATE 时可能使行变得比本来更长 那就招致需要做额外的工做 假设 一个行占用的空间增长 而且在页内没有更多的空间能够存储 在那种情状 下 差别的存储引擎的处置体例是纷歧样的 例如 MyISAM 会将行拆成差别的片段存储 InnoDB则需要团结页来使行能够放进页内 其他一些存储引擎也许从不在原数据位置更新数据

下面那些情状 下利用VARCHAR 是适宜 的 字符串列的更大长度比均匀长度大良多 列的更新很少 所以碎片不是问题 利用了像UTF 如许复杂的字符集 每个字符都利用差别的字节数停止存储

在 或者更高版本 MySQL 在存储和检索时会保留末尾空格 但在 或更老的版本 MySQL 会剔除末尾空格

InnoDB 则更乖巧 它能够把过长的VARCHAR 存储为BLOB 我们稍后讨论那个问题

CHAR

CHAR 类型是定长的 MySQL 老是根据 定义的字符串长度分配足够的空间 当存储CHAR 值时 MySQL 会删除所有的末尾空格(在MySQL 和更老版本中VARCHAR也是如许实现的 也就是说那些版本中CHAR 和VARCHAR 在逻辑上是一样的 区别只是在存储格局上) CHAR 值会根据 需要摘 用空格停止填充以便利比力

CHAR 合适存储很短的字符串 或者所有值都接近统一个长度 例如 CHAR 十分合适存储密码的MD 值 因为那是一个定长的值 关于经常变动的数据 CHAR 也比VARCHAR 更好 因为定长的CHAR 类型不随便 产生碎片 关于十分短的列 CHAR 比VARCHAR 在存储空间上也更有效率 例如用CHAR( ) 来存储只要Y 和N 的值 假设 摘 用单字节字符集注 只需要一个字节 但是VARCHAR( ) 却需要两个字节 因为还有一个笔录 长度的额外字节

CHAR 类型的那些行为可能有一点难以理解 下面通过一个详细的例子来阐明 起首 我们创建一张只要一个CHAR( ) 字段的表而且往里面插进 一些值

当检索那些值的时候 会发现string 末尾的空格被截断了

假设 用VARCHAR( ) 字段存储不异的值 能够得到如下成果

数据若何存储取决于存储引擎 并不是所有的存储引擎城市根据不异的体例处置定长和变长的字符串 Memory 引擎只撑持定长的行 即便有变长字段也会根据 更大长度分配更大空间 不外 填充和截取空格的行为在差别存储引擎都是一样的 因为那是在MySQL 办事器层停止处置的

       返回目次 高性能MySQL

       编纂选举

       ASP NET MVC 框架揭秘

       Oracle索引手艺

       ASP NET开发培训视频教程

lishixinzhi/Article/program/MySQL/201311/29687

MySQL高性能SQL重视 事项简述

数据库做为利用 开发中必不贫乏的根底设备,其性能间接影响利用 的整体运行速度。MySQL是目前最普遍利用的关系型数据库之一,关于开发人员写出性能优良的SQL是必备的根本技能之一。下面简单描述下编写SQL的重视 事项。

编写高量量的SQL需要从以下几个方面重视 ,根本原则、表字段重视 事项、索引利用重视 事项、SQL重视 事项。

根本原则

一、尽量不要在数据库里做运算。假设 碰着 运算尽可能在利用 法式层停止计算。

二、掌握 数据库表数量、掌握 单表数据量、掌握 表的字段数。定见 单库不要超越四百张表,定见 单表字段不要超越五十个,定见 单表的数据量不要超越一万万。

三、不要编写大SQL、不要利用大事务。SQL尽量写的简单点回绝编写大SQL,能够将大SQL拆分红多个小SQL,在利用 层聚合。大事务拆分红多个小事务,快速提交。

表字段重视 事项

一、抉择 适宜 数值字段类型。能用小字段类型的就用小字段类型,如tinyint就比int(1)在表达 小数据时适宜 。

二、能用数字表达 就不要用字符。如能够用无符号INT存储IP而不是字符串表达 。

三、制止利用NULL字段。原因NULL字段查询优化难,含NULL复合索引失效。

四、少用或拆分TEXT/BLOB字段。字段太大需要更多的空间,性能低下,如需利用拆分到零丁表。

五、不要在表字段中存储图片。

索引利用重视 事项

一、合理添加索引。索引添加太多会影响更新速度。可以利用复合索引的制止加多个零丁索引。

二、字符字段成立前缀索引。

三、不在索引列做运算。索引列做运算会招致索引失效。

四、尽量不利用外建。

SQL类重视 事项

一、 SQL语句尽可能简单。大SQL拆分红多个小SQL。

二、事务编写尽量短小。事务即开即用用完立即 封闭。

三、尽量不要利用select *。只取需要的列。

四、改写OR为IN或者改写为UNION操做。OR在数据量大的时候性能低于IN。

五、制止NOT、!=、、NOT IN、NOT EXISTS、NOT LIKE等查询。

六、制止%前缀模糊查询。

七、能用UNION ALL不要用UNION。

八、GROUP BY中往 除排序。自带排序。

九、同类型的字段做比力。字符类和字符类比力,数值类和数值类比力,不要混在一路比力。

十、尽量单表查询,尽量不要多表联系关系查询。多表联系关系查询能够拆分红单表查询在利用 法式中聚合数据。

十一、复合索引的多列重视 最左原则。

上述重视 事项能制止良多性能低下的SQL,期看 在开发过程中能引起重视 。

高性能MySQL:只修改.frm 文件

只修改 frm 文件

从上面的例子我们看到修改表的 frm 文件是很快的 但MySQL 有时候会在没有需要的时候也重建表 假设 情愿 冒一些风险 能够让MySQL 做一些其他类型的修改而不消重建表

我们下面要演示的身手 是不受官方撑持的 也没有文档笔录 而且也可能不克不及一般工做 摘 用那些手艺需要本身承担风险 定见 在施行之前起首备份数据!

下面那些操做是有可能不需要重建表的

移除(不是增加)一个列的 AUTO_INCREMENT属性

增加 移除 或更改ENUM和SET常量 假设 移除的是已经有行数据用到其值的常量 查询将会返回一个空字串值

根本的手艺是为想要的表构造创建一个新的 frm 文件 然后用它替代掉已经存在的那张表的 frm 文件 像下面如许

创建一张有不异构造的空表 并停止所需要的修改(例如增加ENUM 常量)

施行FLUSH TABLES WITH READ LOCK 那将会封闭所有正在利用的表 而且制止任何表被翻开

交换 frm 文件

施行UNLOCK TABLES 来释放第 步的读锁

下面以给sakila film 表的rating 列增加一个常量为例来阐明 当前列看起来如下

      返回目次 高性能MySQL

       编纂选举

       ASP NET MVC 框架揭秘

       Oracle索引手艺

       ASP NET开发培训视频教程

lishixinzhi/Article/program/MySQL/201311/29671

0
回帖

高性能mysql第三版和第四版区别 期待您的回复!

取消