高性能mysql读书笔记三
架构优化和索引
1.数据类型
浮点:FLOAT和DOUBLE使用的是平台的浮点数,分别占用4字节和8字节。DECIMAL是表示精确的小数。
字符串:VARCHAR(255)表示最大长度255字节,对于uft-8编码,将不知道能保留多少字符,中文是3字节,字母1字节,这一点要注意。另外设高上限,因为内存的分配mysql是固定长度的,这样可能会导致内存的浪费。另外会占用额外的1或2字节来记录长度。该类型的问题是修改字段会改变行的大小,可能引起分页。带来额外的工作。但这个问题不是很大,因为预写式日志的存在。CHAR优势比较小了,对于固定长度的,倒是可以用一下,问题是会丢失字符串后面的空格。
时间:DATETIME其实是封装为YYYYMMDDHHMMSS的整数,8字节,相当与bigint,精确到秒
TIMESTAMP:从1970年1月1日到现在的秒数,占用4字节
BIT和SET,都是位集,要使用的时候研究一下跟使用INT有什么区别。
IP地址用无符号整数保存,mysql提供了INET_ATION()和INET_NTOA()实现转化,我这个项目刚好能用上。
2.索引
大部分存储引擎都是用B-Tree(一个节点很多分支,深度一样,为低速IO和按序查找而优化的)来实现。可以匹配全名,匹配最左前缀(找到第一层小于前缀的风格点和第一个大于前缀的风格点,递归)匹配范围值(找到第一层最大小于下届的和最小大于上界的,递归),like也可以看成一个范围值。比如 like ("123%" > "123" and <"124"). 这三种情况可以变成两种。可以组合比如,Key(a,b,c),索引中也是按顺序存储的, a='A'and b like 'B%',相当于abc like "AB%"可以索引 a='A' and b>"B1" and B<"B2" 相当于abc >"AB1" abc<"AB2"
like也可以看成一个范围值。对于多列索引,顺序很重要,如果前一列使用了范围条件,后一列的索引就不能使用了,因为mysql不知道这个范围里包括了多少值,无法组合出索引,所以这个时候In就特别有用,它可以是mysql知道如何组合条件使用索引。
如何select * form employee where gender>=0 and gender <=1 and birthday="1987-08-19",该表上有索引key(gender,birthday),这种写法会扫描全表,
而select * form employee where gender in (0,1) and birthday="1987-08-19"就会使用索引。这个其实优化器还可能优化,而如果gender是字符串,就无从优化了。
Hash索引不能处理范围检索。可以用索引一个保存hash值的列来优化索引的性能。
全文索引:通过分词,建立一个类似B-Tree的结构。
3.索引优化:
(1).有索引的列要单独出现在表达式的一边,这是最简单的,第二,表达式也最好不要有其他的变量,比如CURRENT_DATE,这个会影响缓存。(这个也许新的版本能优化)
(2).前缀索引,把字符串的前面一部分用做索引,Text字段会很需要,要关注选择性和平均性两个指标,语法alert table table_name add key (column_name(N)).