`
id.alex
  • 浏览: 22259 次
社区版块
存档分类
最新评论

高性能MySQL总结-第三章: 架构优化和索引

阅读更多
只是一些 tips, 用于记忆和参照使用.
万事不是绝对,只适用与大多数场合.

3.1 数据类型

数据类型越小越好:
比如 char 对比 varchar, 使用了更少的磁盘空间、内存和CPU缓存.
越简单越好
int 比 字符串 好,datatime 比 字符串好, 整数比 ip地址字符串好.
尽量避免 NULL
可空查询会把索引变得更复杂.

timestamp 使用的空间 只有 datetime 的一半,

3.1.1 整数
1. 选择合适的位数长度.
2. 可选属性 unsigned.

3.1.2 实数
float 和 double 对于 decimal 来说,更小,精准度更高,范围更大,但运算时,这两个会造成丢失精度.

3.1.3 字符串
1. varchar 会清除末尾空格, char 不会.
2. varchar 需要使用1或2个字节来存储实际长度. 当 <= 255 时,用1个字节.
3. varchar(n) n 不同时,虽然保存相同的字符串占用的空间一样, 但 n 越小消耗的内存越小.
4. blob,text 类型会按照 max_sort_length 前若干个字节进行排序.
5. enum 代替字符串,用法等同于 java, 实际也是数字.可以
select e+0,e from enum_test
来查看具体的数值.

3.1.4 日期和时间
1. mysql 最细精度为秒.
2. datetime 实际是 YYYYMMDDHHMMSS 整数, 与时区无关.
3. timestamp 只能表示从 1970 - 2038, 只占用 4 字节.
4. from_unixtime() 和 unix_timestamp()
5. timestamp 依赖时区, MySQL 服务器 ,操作系统,客户端连接都有时区设置.

3.1.6 标识符
1.  最好使用整数做标识符.
2. 字符串做标识符会比较慢, 在压缩的 MyISAM 引擎下要慢6倍.
3. 性能上 int > uuid > hashcode

3.1.7 特殊数据
使用无符号整数保存 ip地址 , inet_aton() inet_ntoa()

3.2 索引基础
1. column 的类型因为 Hibernate 等 ORM 框架使得对开发人员透明,推荐不要自动生成表,要写script .
2. Column 创建的顺序也很重要.
3. 索引多列数据,MySQL 只能搜索索引最左前缀.

3.2.1 索引类型
1. B-Tree 索引. 只能全索引或索引最左前缀.
2. Hash 索引. 需要自己维护 Hash code 列. 可以有个 trigger 来 insert 和 update hash 索引列.
3. 空间索引 R-Tree, MyISAM 支持 R-Tree.
4. 全文索引.

3.3 索引策略

3.3.1 隔离列
"隔离"列意味着索引列不是表达式的一部分,也没有位于函数中.

3.3.2 前缀索引
如果一列数据太长,用hash索引未必是最好的选择.
可以使用前缀索引. 及取前 N 个长度的字符作为索引.
N 的选择原则1:
-- 全列的选择性
select count(distinct city)/count(*) from sakila.city; 
-- N长度前缀的选择性
select count(distinct left(city,N))/count(*) from sakila.city;
-- create index sql
alter table sakila.city add key (city(7))


3.4 索引研究

3.4.1 多种过滤条件
in 语句可以引用索引.
一个索引从左开始,直至第一个范围查询,比如: ">" 和 "<" 这类,还有 between.
为了最左前缀匹配,可以把 sex 这种放在索引最左边,即使没有根据sex 去查询,也可以把  sex in ('male','female') 放在 sql 里.
应该把范围条件放在索引的最右边,比如 age.
大量的in组合也会有问题, 比如  a in (1,2,3) and b in (4,5,6) and c in (7,8,9)
那么就认为这是  3 * 3 * 3 种组合.如果上千,那么会非常慢.

3.4.2 避免多个范围条件
避免这样的查询
select * from customer where age > ? and salary > ?

无法为两个范围条件使用索引,这种情况可以根据业务逻辑将其中一列转换为可以用 in 查找,
比如 salary 大于 1w 小于 2w 的会有另外一列保存为 1, 可以创建一个 (salary_mapping_column,age) 这样的索引.

3.4.3 优化排序
1. 为低选择性列排序加索引, 例如 (sex,rating).可以优化下面这个 SQL, 有 order by 和 limit 没有索引会很慢.
select * from profiles where sex='M' order by rating limit 10


2. 即使有索引,这样也会很慢
select * from profiles where sex='M' order by rating limit 10000,10

这样的 SQL 可以优化为:
select * from profiles  inner join(
select pk from profiles where x.sex ='M' order by rating limit 100000, 10
) as x using(pk)



3.7 加速 alter table

3.7.1 只修改 .frm
移除列的 auto_increment
添加\移除或更改 ENUM 和 SET 常量.

3.8 对存储引擎说明

3.8.1 MyISAM
表锁, 不支持自动数据恢复, 只有索引被缓存在内存中, 紧密存储.

3.8.2 Memory
表锁, 不支持动态行,哈希索引是默认索引类型, 没有索引统计, 重启后丢失数据.

3.8.3 InnoDB
事务性, 外键, 行级锁, 多版本, 按主键聚集, 所有索引包含主键列, 优化缓存, 未压缩的索引, 数据装载缓慢, 阻塞 AUTO_INCREMENT, 没有缓存 count(*)
分享到:
评论

相关推荐

    高性能MySQL_第3版_超清中文带目录版[PDF]

    第3章:架构优化和索引 80 第4章:查询性能优化 152 第5章:MySQL高级特性 204 第6章:优化服务器设置 265 第7章:操作系统和硬件优化 305 第8章:复制 343 第9章:伸缩性与高可用性 409 第10章:应用层面的优化 457...

    高性能MySQL(第3版).Baron.Scbwartz_2

    第1章 mysql 架构与历史 1 第2章 mysql 基准测试 35 第3章 服务器性能剖析 67 第4章 schema 与数据类型优化 111 第5章 创建高性能的索引 141 第6章 查询性能优化 195 第7章 mysql 高级特性 259 第8章 优化服务器设置...

    高性能MySQL(第3版)

    第5章 创建高性能的索引 第6章 查询性能优化 第7章 MySQL 高级特性 第8章 优化服务器设置 第9章 操作系统和硬件优化 第10章 复制 第11章 可扩展的MySQL 第12章 高可用性 第13章 云端的MySQL 第14章 应用层...

    [[高性能MySQL(第3版)].Baron.Scbwartz等.扫描版[电子书.pdf

    [[高性能MySQL(第3版)].Baron.Scbwartz等.扫描版[电子书.pdf,主要内容包括:第一章mysql架构与历史;第二章mysql基准与测试;第三章服务器性能剖析;第四章schema与数据类型优化;第五章创建高性能索引;第六章...

    高性能MySQL(第3版).part2

    第5章创建高性能的索引141 5.1索引基础141 5.1.1索引的类型142 5.2索引的优点152 5.3高性能的索引策略153 5.3.1独立的列153 5.3.2前缀索引和索引选择性153 5.3.3多列索引157 5.3.4选择合适的索引列顺序159 ...

    高性能MySQL(第3版).Baron.Scbwartz_1

    第5章 创建高性能的索引 141 第6章 查询性能优化 195 第7章 mysql 高级特性 259 第8章 优化服务器设置 325 第9章 操作系统和硬件优化 377 第10章 复制 433 第11章 可扩展的mysql 501 第12章 高可用性 543 第13章 ...

    新浪首席DBA主讲 Mysql高级DBA实战

    第3章:MySQL硬件优化与监控 第4章:MySQL基准测试 第5章:MySQL Schema设计与索引 第6章:SQL优化与高级特性 第7章:MySQL备份 第8章:MySQL备份与恢复深入 第9章:MySQL的复制 第10章:MySQL高可用及可扩展架构 第...

    高性能Mysql.pdf

    第3章 架构优化和索引 第4章 查询性能优化 第5章 MySQL高级特性 第6章 优化服务器设置 第7章 操作系统和硬件优化 第8章 复制 第9章 伸缩性与高可用性 第10章 应用层面的优化 第11章 备份与还原 第12章 安全 第13章 ...

    高性能mysql第三版.pdf

    高性能Mysql Mysql书籍 索引 SQL优化 高可用 系统架构

    MySQL性能调优与架构设计(中文版)

     第3章 MySQL存储引擎简介   3.0 引言   3.1 MySQL存储引擎概述   3.2 MyISAM存储引擎简介   3.3 InnoDB存储引擎简介   第4章 MySQL安全管理  4.0 引言  4.1 数据库系统安全相关因素  4.2 ...

    MySQL5.1性能调优与架构设计.mobi

    第3章 MySQL存储引擎简介 3.0 引言 3.1 MySQL存储引擎概述 3.2 MyISAM存储引擎简介 3.3 InnoDB存储引擎简介 3.4 NDB Cluster存储引擎简介 3.5 其他存储引擎介绍 3.6 小结 第4章 MySQL安全管理 4.0 引言 ...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    03-大规模集群架构中MySQL高可用的位置和架构mp4 04-MySQL高可用实战模拟环境描述mp4 05-MySQL高可用生产场景配置及网络地址规划mp4 06-MySQL高可用实施正式环境准备与裂脑注意mp4 07-快速安装双机Centos6.4下...

    mysql介绍和性能优化.docx

    7. 数据库维护:定期进行分析、优化和重建索引,清理无用数据。 除此之外,MySQL还提供了性能监控和分析工具,如`EXPLAIN`来分析查询执行计划,`SHOW STATUS`和`SHOW VARIABLES`来查看服务器状态和配置,以及`pt-...

    MySQL海量数据存储与优化(上).pdf

    本文将详细介绍MySQL的架构原理、存储机制、索引存储机制、事务和锁机制、集群架构、MySQL第三方工具实战,以及MySQL的发展历程和应用架构演变。 一、MySQL架构原理 MySQL的架构分为内存结构和磁盘结构。内存结构...

    PHP特级课:LVS负载均衡:搜索引擎.docx

    第 5 章: Mysql性能优化 第15集 Mysql基础操作-1 48分钟 第16集 Mysql基础操作-2 49分钟 第17集 Mysql Sql语句技巧与优化 63分钟 第18集 Mysql索引优化 60分钟 第19集 数据库与服务器优化 40分钟 第 6 章: Mrtg...

    MySQL与MongoDB数据库架构介绍.pptx

    MySQL 体系结构具有强大的体系结构、集群架构的多样性、第三方工具种类丰富、社区用户活跃、完整的复制体系、不同的插件式存储引擎的支持(InnoDB)、强大的多行事务的支持等特点。 MySQL 备份恢复 MySQL 备份...

Global site tag (gtag.js) - Google Analytics