MySQL手册版本 5.0.20-MySQL优化(六)

2016-01-29 14:57 6 1 收藏

MySQL手册版本 5.0.20-MySQL优化(六),MySQL手册版本 5.0.20-MySQL优化(六)

【 tulaoshi.com - MySQL 】

7.4优化数据库结构

7.4.1设计选择

MySQL将记录数据和索引数据分别存放在不同的文件里。其他很多(几乎所有)数据库都将这记录和索引数据存在同一个文件中。我们相信MySQL的选择对于现在更大范围的系统更合适。

另一个存储记录数据的方法是将每个字段的信息保存在独立的区域中(例如 SDBM 和Focus)。这当每个查询都要访问不只一个字段的时候会打击性能。由于当访问越多的字段后,性能下降的越厉害,因此我们认为这种模式不适合正常目的的数据库。

更多的情况是把索引和数据保存在一起(例如 Oracle/Sysbase等)。这样的话,就能在索引的叶子页面找到记录的信息。这种布局的有利之处在于,很多时候由于索引被缓存的比较好,因此就能节省磁盘读取,不过也有如下缺点:

由于需要通过读取索引才能得到数据,因此扫描表就更慢了。

查询时只能根据索引来取得数据。

需要更多的磁盘空间,因为必须从节点中复制索引(不能将记录保存在节点中)。

删除会使表变得更慢(因为删除时并没有更新节点中的索引)。

很难只缓存索引数据。

7.4.2让数据变得更小巧灵活

优化的最基本原则之一就是尽可能把数据表设计的占用更少磁盘空间。这能得到巨大的性能改善,因为磁盘读取比较快,并且越小的表在处理查询内容时只需更少的主内存。在小点的字段上做索引也只需更少的资源负载。

MySQL支持很多种不同的表类型以及记录格式。可以决定每个表要采用那种存储引擎/索引方式。根据不同的应用程序选择适当的表格式能大大提高性能。详情请看“15MySQL Storage Engines and Table Types”。

用以下方法可以提高表性能同时节省存储空间:

尽可能使用最有效(最小的)数据类型。MySQL有好几种特定的类型能节省磁盘和内存。

尽可能使用更小的整数类型。例如,MEDIUMINT通常比更合适 INT。

尽可能定义字段类型为 NOT NULL。这会运行的更快,而且每个字段都会节省1个bit。如果在应用程序中确实需要用到 NULL,那么就明确的指定它。不过要避免所有的字段默认值是 NULL。

在 MyISAM 表中,如果没有用到任何变长字段(VARCHAR, TEXT, 或 BLOB字段)的话,那么就采用固定大小的记录格式。这样速度更快,不过可能会浪费点空间。详情请看“15.1.3 MyISAMTable Storage Formats”。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/mysql/)

表的主索引应尽可能短。这样的话会每条记录都有名字标识且更高效。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/mysql/)

只创建确实需要的索引。索引有利于检索记录,但是不利于快速保存记录。如果总是要在表的组合字段上做搜索,那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是需要用到很多字段,首先就应该多复制这些字段,使索引更好的压缩。

一个字段很有可能在最开始的一些数量字符是各不相同的,因此在这些字符上做索引更合适。MySQL支持在一个字段的最左部分字符做索引。索引越短,速度越快,不仅是因为它占用更少的磁盘空间,也因为这提高了索引缓存的命中率,由此减少了磁盘搜索。详情请看“7.5.2Tuning Server Parameters”。

在某些情况下,把一个频繁扫描的表分割成两个更有利。在对动态格式表扫描以取得相关记录时,它可能使用更小的静态格式表的情况下更是如此。

7.4.3字段索引

所有的MySQL字段类型都能被索引。在相关字段上做索引对提高 SELECT 语句的性能最有效。

每个表的最大索引长度以及最多索引数量是由各自的存储引擎定义好了的。详情请看“15 MySQL Storage Engines and Table Types”。所有的存储引擎对每个表都至少可以支持16个索引,索引长度最小是 256 字节。大部分存储引擎的限制更高。

索引格式中使用 col_name(length) 语法,就能只对 CHAR 或 VARCHAR 字段最前面的 length 个字符做索引。象类似这样只对字段的前缀部分做索引能让索引文件更小。

MyISA

来源:http://www.tulaoshi.com/n/20160129/1494811.html

延伸阅读
标签: PHP
通常地,应该保存所有的冗余数据(在数据库原理中叫做"第三范式")。然而,为了能取得更高的效率复制一些信息或者创建摘要表也是划算的。 存储过程或者 UDFs(用户定义函数) 的方式在执行一些任务时可能性能更高。尽管如此,当数据库不支持这些特性时,还是有其他的替代方法可以达到目的,即使它们有点慢。 可...
标签: PHP
7.2.12 加速 INSERT 插入一条记录花费的时间由以下几个因素决定,后面的数字大致表示影响的比例: 连接:(3) 发送查询给服务器:(2) 解析查询:(2) 插入记录:(1 x 记录大小) 插入索引:(1 x 索引数量) 关闭:(1) 这里并没有考虑初始化时打开数据表的开销,因为每次运行查询只会做这么一次...
标签: PHP
6.5 不同 MySQL 版本之间的同步兼容性 最早的二进制格式是在MySQL 3.23中开发出来的。在MySQL 4.0中改进了,MySQL 5.0又改进了。在配置同步时需要升级服务器的话,它们之间的因果关系在"6.6 Upgrading a Replication Setup"中描述了。 如果只关心同步,任何MySQL 4.1.x版本和MySQL 4.0.x是一样的,因为它们都使用...
标签: PHP
6.4 设置同步 以下描述了如何快速设置 MySQL 同步服务器。假设你打算同步全部的数据库,并且之前没有设置过。需要关闭master服务器以完成全部的步骤。 本章描述的过程可以用于一个slave的情况,也可以用于多个slave的情况。 这只是一个最直接设置slave的办法,并不是只有一个。例如,已经有了master的数据快照...
二十六、如何知晓MySQL解决一条查询 运行项列命令并试图弄明白其输出: SHOW VARIABLES; SHOW COLUMNS FROM ...G EXPLAIN SELECT ...G FLUSH STATUS; SELECT ...; SHOW STATUS; 二十七、MySQL非常不错 日志 在进行很多连接时,连接非常快。 同时使用SELECT和INSERT的场合。 ...

经验教程

466

收藏

72
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部