文章分类 - 数据库性能优化
Mysql,SQLite
摘要:Mysql的优化是非常重要的。其他最常用也最需要优化的就是limit。Mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。 同样是取10条数据 select * from yanxue8_visit limit 10000,10 和 select * from yanxue8_visit limit 0,10 就不是一个数量级别的。 网上也很多关于limit的五条优化准则,都是翻译自Mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。 文中不是直接使用limit,而是首先获取到offset的id然后直...
阅读全文
摘要:日期和时间类型 MySQL有多个表示各种日期和时间值的数据类型, 比如YEAR和DATE. MySQL存储时间的最精确粒度是秒。 然而, 能做微妙粒度的临时计算, 我们会列出一些绕过存储引擎限制的一些方法。 许多时间类型都没有可替换类型, 因而不存在什么是最佳选择这么一说。 唯一的问题是当需要一起存储日期和时间时如何做?MySQL提供了两个非常类似的数据类型来做这个事情: DATETIME和TIMESTAMP. 多大多数应用来说, 两个都行, 但是在某些场合, 一个可能比另一个更合适: DATETIME 这个类型能够存储很大范围的值, 从1001年到9999年, 准确到秒的精度。它...
阅读全文
摘要:使用ENUM代替字符串类型 有时候, 可以通过使用ENUM来代理常规的字符串类型。一个ENUM列能够存储65535个不同的字符串值,MySQL非常紧凑的存储这些值,会根据值列表把这些值存储到1到2个字节中。通过在表的.frm文件中保存一个数字到字符串的对应关系来保存一个”查询表”, 它把每个值存储成一个表示值在字段定义列表中的某个位置的整数。 下面是几个例子; mysql> CREATE TABLE enum_test( -> e ENUM(‘fish’, ‘apple’, ‘dog’) NOT NULL -> ); mysql> INSERT INTO enum_te
阅读全文
摘要:如何避免磁盘临时表 因为内存储引擎不支持TEXT和BLOB数据类型, 使用到BLOB和TEXT列的查询和使用隐式临时表的查询将不得不使用MyISAM的磁盘临时表, 即使只有很少的几条记录。 这可能导致很严重的性能开销。即使把MySQL配置成在RAM盘上使用临时表, 也会用到一些开销大的系统调用(Maria存储引擎应该能通过把所有的东西, 而不只是索引,缓存在内存中而在一定程度上缓解这个问题)。最好的解决办法是避免使用BLOB和TEXT类型, 除非费用不可。 如果无法避免使用BLOB和TEXT类型, 应该能够通过使用ORDER BY SUBSTRING(column, length) ...
阅读全文
摘要:Multiversion Concurrency Control 多版本并发控制 大部分的MySQL的存储 引擎,比如InnoDB,Falcon,以及PBXT并不是简简单单的使用行锁机制。它们都使用了行锁结合一种提高并发的技术,被称为MVCC(多版本并 发控制)。MVCC并不单单应用在MySQL中,其他的数据库如Oracle,PostgreSQL,以及其他数据库也使用这个技术。 MVCC避免了许多需要加锁的情形以及降低消耗。这取决于它实现的方式,它允许非阻塞读取,在写的操作的时候阻塞必要的记录。 MVCC保存了某一时刻数据的一个快照。意思就是无论事物运行了多久,它们都能看到一致的数...
阅读全文
摘要:当存储一个CHAR值时, Mysql会除去尾随空间, 这个行为有点让人困惑, 用一个具体的例子来看一下: 首先 ,创建一个只有一个CHAR(10)字段的表并存储一些值在里面: mysql> CREATE TABLE char_test( char_col CHAR(10)); mysql> INSERT INTO char_test(char_col) VALUES -> (’string1′), (‘ string2′), (’string3 ‘); 然后检索这些值, 尾部空间被除掉了: mysql> SELECT CONCAT(“‘”, char_col, “‘”)
阅读全文
摘要:Bit-Packed Data Types MySQL有一些存储类型使用一个值中的一些单个的比特位来紧凑的存储数据。纯技术上将,不管是底层的存储格式还是操作,所有这些类型都是字符串类型。 BIT MySQL5.0以前, BIT只是TINYINT的同义词而已。但是在MySQL5.0以及之后的版本,BIT是一个完全不同的数据类型了, 有着自己的一些特点, 这里讨论一些新的行为和属性: 可以用BIT字段在单列里面来存储一个或多个true/false值, BIT(1)定义一个了只包含单个比特位的字段, BIT(2)是存储2个比特位的字段, 如此类推;BIT字段的最大长度可以是64个比特。 B...
阅读全文
摘要:String Types(字符串类型)字符串类型 Mysql支持多种字符串类型的变体。 这些数据类型在4.1和5.0版本中有较大的变化, 这使得这些数据类型变得更加复杂。 从Mysql4.1起, 每个字符串类型能有自己的字符集和针对这些字符集的排序规则集 (更多的关于排序规则的主题, 参考第5章), 这对于性能有较大的影响。 VARCHAR和CHAR类型 VARCHAR和CHAR是两种最主要的存储字符串的数据类型, 不幸的是,的确有些困难解释这两种数据类型在磁盘和内存中是如何存储的, 因为这是与存储引擎相关的(比如, Falcon的差不多所有数1是, 请参考相应的存储引擎文档。 先看看...
阅读全文
摘要:Real Numbers 实数 实数是具有小数部分的数字, 当然, 实数不是专门用来表示小数的, 也可以用DECIMAL来存储那些无法用INTERGER来存储的大整数。 Mysql同时支持准确的和非准确的类型。 FLOAT和DOUBLE类型支持近似的标准浮点数数学计算。 如果需要知道准确的浮点数计算, 参考具体平台的浮点数计算规则。 DECIMAL类型是用来存储准确的小数, 在mysql 5.0以后的版本, DECIMAL支持准确的数学计算。在Mysql4.1 及以前的版本中, MUMERIC类型也是用浮点计算来完成运算的, 因此可能会出现一些由于精度损失而出现的一些不准确的结果, 在...
阅读全文
摘要:决定数据类型的第一步是定义所存数数据的分类: 数值型, 字符串型还是临时型等;除了一些特别的并不是那么直观的外, 这通常是很直观的。 接下来是选择具体的数据类型, 许多mysql的数据类型能存储同一种数据, 但是在可存储的数据范围, 准确度或者存储空间有些不同。 有些数据类型可能还有一些特殊的行为属性。比如, DATETIME和TIMESTAMP都能存储日期和日期, 而且都是准确到秒; 然而, TIMESTAMP占的数据空间只有DATETIME的一半, 而且是时区敏感的,同时有一些自动修改的机制。 另一个方面, 它能表示的数据范围要小些, 有些属性在某些时候是比较麻烦的。 这里只讨论了一些..
阅读全文
摘要:Choosing Optimal Data Types选择正确的数据类型 Mysql 提供多种数据类型的支持,选择正确的数据类型对能否得到高性能的设计影响很大。 以下一些简单的指导规则能帮助您对各种数据类型的设计决策做出更好的选择:小的比大的好 一般来说, 在保证正确性的前提下, 尽量使用最小的数据类型来存储和表示数据。 小的数据类型一般比大的更快, 因为小的数据类型占用的磁盘空间, 内存和cup缓存都相对小, 需要的cpu处理也要相对少; 这个原则很重要。简单的就是好的 简单的数据类型需要的cup处理周期更少, 比如, 对整数的处理比字符串处理更容易, 因为字符集和排序规则使得字符串比...
阅读全文

浙公网安备 33010602011771号