高性能MySQL:选择标识符(identifier)

作者&投稿:徵房 (若有异议请与网页底部的电邮联系)
~

   选择标识符(identifier)

  为标识列(identifier column)选择合适的数据类型非常重要 一般来说更有可能用标识列与其他值进行比较(例如 在关联操作中) 或者通过标识列寻找其他列 标识列也可能在另外的表中作为外键使用 所以为标识列选择数据类型时 应该选择跟关联表中的对应列一样的类型(正如我们在本章早些时候所论述的一样 在相关的表中使用相同的数据类型是个好主意 因为这些列很可能在关联中使用)

  当选择标识列的类型时 不仅仅需要考虑存储类型 还需要考虑MySQL 对这种类型怎么执行计算和比较 例如 MySQL 在内部使用整数存储ENUM 和SET 类型 然后在做比较操作时转换为字符串

  一旦选定了一种类型 要确保在所有关联表中都使用同样的类型 类型之间需要精确匹配 包括像UNSIGNED 这样的属性注 混用不同数据类型可能导致性能问题 即使没有性能影响 在比较操作时隐式类型转换也可能导致很难发现的错误 这种错误可能会很久以后才突然出现 那时候可能都已经忘记是在比较不同的数据类型

  在可以满足值的范围的需求 并且预留未来增长空间的前提下 应该选择最小的数据类型 例如有一个state_id 列存储美国各州的名字注 就不需要几千或几百万个值 所以不需要使用INT TINYINT 足够存储 而且比INT 少了 个字节 如果用这个值作为其他表的外键 个字节可能导致很大的性能差异 下面是一些小技巧 整数类型

  整数通常是标识列最好的选择 因为它们很快并且可以使用AUTO_INCREMENT

   ENUM 和SET 类型

  对于标识列来说 EMUM 和SET 类型通常是一个糟糕的选择 尽管对某些只包含固定状态或者类型的静态 定义表 来说可能是没有问题的 ENUM 和SET 列适合存储固定信息 例如有序的状态 产品类型 人的性别

  举个例子 如果使用枚举字段来定义产品类型 也许会设计一张以这个枚举字段为主键的查找表(可以在查找表中增加一些列来保存描述性质的文本 这样就能够生成一个术语表 或者为网站的下拉菜单提供有意义的标签) 这时 使用枚举类型作为标识列是可行的 但是大部分情况下都要避免这么做

  字符串类型如果可能 应该避免使用字符串类型作为标识列 因为它们很消耗空间 并且通常比数字类型慢 尤其是在MyISAM 表里使用字符串作为标识列时要特别小心

  MyISAM 默认对字符串使用压缩索引 这会导致查询慢得多 在我们的测试中 我们注意到最多有 倍的性能下降

  对于完全 随机 的字符串也需要多加注意 例如MD () SHA () 或者UUID() 产生的字符串 这些函数生成的新值会任意分布在很大的空间内 这会导致INSERT 以及一些SELECT 语句变得很慢注 :

  因为插y 入值会随机地写到索引的不同位置 所以使得INSERT语句更慢 这会导致页分裂 磁盘随机访问 以及对于聚簇存储引擎产生聚簇索引碎片 关于这一点第 章有更多的讨论

  SELECT语句会变得更慢 因为逻辑上相邻的行会分布在磁盘和内存的不同地方

  随机值导致缓存对所有类型的查询语句效果都很差 因为会使得缓存赖以工作的访问局部性原理失效 如果整个数据集都一样的 热 那么缓存任何一部分特定数据到内存都没有好处 如果工作集比内存大 缓存将会有很多刷新和不命中

  如果存储UUID 值 则应该移除 符号 或者更好的做法是 用UNHEX() 函数转换UUID 值为 字节的数字 并且存储在一个BINARY( ) 列中 检索时可以通过HEX()函数来格式化为十六进制格式

  UUID() 生成的值与加密散列函数例如SHA () 生成的值有不同的特征 UUID 值虽然分布也不均匀 但还是有一定顺序的 尽管如此 但还是不如递增的整数好用

   当心自动生成的schema

  我们已经介绍了大部分重要数据类型的考虑(有些会严重影响性能 有些则影响较小) 但是我们还没有提到自动生成的schema 设计有多么糟糕

  写得很烂的schema 迁移程序 或者自动生成schema 的程序 都会导致严重的性能问题 有些程序存储任何东西都会使用很大的VARCHAR 列 或者对需要在关联时比较的列使用不同的数据类型 如果schema 是自动生成的 一定要反复检查确认没有问题

  对象关系映射(ORM)系统(以及使用它们的 框架 )是另一种常见的性能噩梦 一些ORM 系统会存储任意类型的数据到任意类型的后端数据存储中 这通常意味着其没有设计使用更优的数据类型来存储 有时会为每个对象的每个属性使用单独的行 甚至使用基于时间戳的版本控制 导致单个属性会有多个版本存在

  这种设计对开发者很有吸引力 因为这使得他们可以用面向对象的方式工作 不需要考虑数据是怎么存储的 然而 对开发者隐藏复杂性 的应用通常不能很好地扩展 我们建议在用性能交换开发人员的效率之前仔细考虑 并且总是在真实大小的数据集上做测试 这样就不会太晚才发现性能问题

      返回目录 高性能MySQL

       编辑推荐

       ASP NET MVC 框架揭秘

       Oracle索引技术

       ASP NET开发培训视频教程

lishixinzhi/Article/program/MySQL/201311/29682




怎样优化mysql数据库来提高mysql性能(mysql数据库的优化)
1、选取最适用的字段属性。MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。2、使用连接(JOIN)来代替子查询(Sub-Queries)。MySQL从4.1开始支持SQL的子查询。...

高性能MySQL:选择标识符(identifier)
当选择标识列的类型时 不仅仅需要考虑存储类型 还需要考虑MySQL 对这种类型怎么执行计算和比较 例如 MySQL 在内部使用整数存储ENUM 和SET 类型 然后在做比较操作时转换为字符串 一旦选定了一种类型 要确保在所有关联表中都使用同样的类型 类型之间需要精确匹配 包括像UNSIGNED 这样的属性注 混用不同数据类型...

MySQL极具参考价值的性能(下)
MySQL极具参考价值的性能有哪些?临时表的监测是许多预定义的Monyog监测之一。它提供了一些临时表使用的指标,包括:允许的最大值:显示tmp_table_size服务器变量的值,它定义了在内存中创建的临时表的最大大小。与max_heap_table_size一起,这个值定义了可以在内存中创建的临时表的最大大小。如果内存临...

mysql性能的检查和调优方法[3]
嗯 这时可以看到mysql使用了userid这个索引搜索了 用userid索引一次搜索后 结果集有 条 然后虽然使用了filesort一条一条排序 但是因为结果集只有区区 条 效率问题得以缓解 但是 如果我用别的userid查询 结果又会有所不同 mysql> desc select * from imgs where userid= admin order by clicks desc...

mysql哪个版本好
MySQL 5.7及之后的版本都是不错的选择。MySQL是一个流行的开源关系数据库管理系统,随着版本的迭代更新,功能不断增强,性能也在不断优化。对于大多数用户来说,MySQL 5.7及之后的版本都是很好的选择。这些版本在稳定性、安全性、易用性以及管理性方面都得到了很大的提升。1. 稳定性和性能优化:MySQL...

mysql调优的几种方式
MySQL调优是许多网站和公司的重要任务之一。MySQL是一个非常流行的关系型数据库管理系统,因此对其进行优化可以提高网站的性能和响应时间。下面介绍一些MySQL调优的常用方法:1. 使用索引:索引是MySQL中一种优化查询速度的技术。在处理大量数据时,索引可以显著提高查询速度。要使用索引,需要在数据库表中添加...

如何测试mysql的性能和稳定性
例如,可以用来测试文件I\/O、操作系统调度器、内存分配和传输速度、POSIX 线程,以及数据库服务器等。sysbench 支持Lua 脚本语言,Lua 对于各种测试场景的设置可以非常灵活。sysbench 是我们非常喜欢的一种全能测试工具,支持MySQL、操作系统和硬件的硬件测试。(节选自《高性能MySQL》)

mysql的优点
2、MySQL性能卓越、服务稳定,很少出现异常宕机。MySQL开放源代码且无版权制约,自主性及使用成本低。MySQL历史悠久,用户使用活跃,遇到问题可以寻求帮助。MySQL体积小,安装方便,易于维护。3、价格:MySQL对多数个人来说是免费的。容易使用;与其他大型数据库的设置和管理相比,其复杂程度较低,容易学习。可...

mysql选哪个版本
MySQL 5.7和MySQL 8.0都是LTS版本。测试与评估 在选择MySQL版本之前,建议进行实际测试并评估不同版本在你的特定环境下的性能。这样可以确保所选版本能够满足你的实际需求,并且在生产环境中表现良好。总之,选择合适的MySQL版本是非常重要的决策,需要根据项目需求、系统环境以及版本的特性进行综合考虑。

高性能MySQL:计数器表
虽然写操作变得更慢了 但更显著地提高了读操作的性能 然而 写操作变慢并不是读操作变得更快所付出的唯一代价 还可能同时增加了读操作和写操作的开发难度 返回目录 高性能MySQL 编辑推荐 ASP NET MVC 框架揭秘 Oracle索引技术 ASP NET开发培训视频教程 lishixinzhi\/Article\/program\/MySQL\/201311\/29673 ...

余江县15787139604: sql语句大全??? -
顾坚安体: SQL查询语句大全集锦 一、 简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句.它们分别说明所查询列、查询的 表或视图、以及搜索条件等.例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和...

余江县15787139604: mysql分表分区哪个好 -
顾坚安体: 一、什么是mysql分表和分区什么是分表,从表面意思上看呢,就是把一张表分成N多个小表什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上二、mysql分表和分区有什么区别呢1、...

余江县15787139604: 怎么学习SQL数据库的语句? -
顾坚安体: 一、 简单查询简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句.它们分别说明所查询列、查询的表或视图、以及搜索条件等. 例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段. SELECT ...

余江县15787139604: 如何创建mysql索引以及索引的优缺点 -
顾坚安体: mysql教程:索引的使用以及索引的优缺点1. 索引(index)是帮助MySQL高效获取数据的数据结构.它对于高性能非常关键,但人们通常会忘记或误解它.索引在数据越大的时候越重要.规模小、负载轻的数据库即使没有索引,也能有好的性能...

余江县15787139604: 谈谈如何选择合适的MySQL数据类型 -
顾坚安体: 1.选择数据类型的基本原则 前提: 使用适合存储引擎. MyISAM数据表,最好使用固定长度的数据列代替可变长度的数据列. 2). MEMORY存储引擎和数据列 MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或...

余江县15787139604: mysql分区分表哪个好 -
顾坚安体: Mysql分表和分区的区别 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可...

余江县15787139604: 关于mysql的自增id测试,innodb和myisam下的不同表现 -
顾坚安体: 关于mysql的自增id测试,innodb和myisam下的不同表现 mysql> update innodb_test set id=105 where id=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from innodb_test; +-----+ | id | +-----+ | 2 | ...

余江县15787139604: 如何提高MySQL Limit查询的性能 -
顾坚安体: 如何提高MySQL Limit查询的性能? 在MySQL数据库操作中,我们在做一些查询的时候总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的.其实我们可以使用Limit关键字来避免全表扫...

余江县15787139604: sql server中,标识列具有哪些特点 -
顾坚安体: SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: 1、列的数据类型为不带小数的数值类型 2、在进行插入(Insert)操作时,该列的值是由系统按来一定规律源生成,不允许空值 3、列值不重复,具有标识表...

余江县15787139604: sql profiler 怎么跟踪指定客户端 -
顾坚安体: 连接--跟踪属性--事件选择--列筛选器(alt+f):一般用选 SPID,再指定下DatabaseName

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网