【mysql】mysql学习笔记
2015-06-10 17:19
501 查看
1.库表设计
1.1表字段选择以满足需求为主
更小的更好,尽量使用可以正确存储数据的最小数据类型,能用smallint 就没必要用int简单的更好,简单的类型的代价也更低
避免NULL值,存在NULL值mysql在处理上会难优化
1.2表大小
单个表太大的话,可以考虑拆分表1.3范式化与反范式化的混合
适当的构建冗余字段,对于查询还是非常有好处的不然就要关联查询了,多一次IO总是耗性能的
也可以考虑构建个汇总表,对于实时性不敏感的数据,定期维护一个汇总表,可以提高查询的性能
2.索引
2.1索引的优点
先抛出主题,高性能mysql里提到索引有三个优点:1)大大减少服务器需要扫描的数据量
2)可以帮助服务器避免排序和临时表
3)可以将随机IO变为顺序IO
2.2 BTree
一般书里都提BTree,但是实际的技术实现里都是B+TreeBTree的数据结构所形成的查询方式,有点像二分查找的感觉,对数据组织是顺序的
从根节点开始,通过比较节点页的值和要找的值找到合适的指针进入下层子节点
每进入一层子节点,相当于一次IO。如果没有索引则所有查找都是一次IO操作,代价非常可观
2.3 BTree 查询类型
全键值匹配,顾名思义,就是索引的每一列都要匹配键值范围匹配,就是索引某一列范围匹配
键前缀查找,只适用于最左前缀查找
具体的查询类型:
全值匹配
匹配最左前缀
匹配列前缀
匹配范围值
精确匹配某一列并范围匹配另外一列
只访问索引的查询,这是覆盖索引
notice:
鉴于BTree本身对数据的顺序组织方式,如果是个多列索引(A,B,C),则匹配过程,就会是A,B,C的匹配顺序
顺序不对则mysql就不知道如何匹配了,因为组织数据就是按照这个顺序来组织的
必须从索引的最左列开始查找,因为建索引的时候就是从最左列开始建的,不从这开始,mysql不知道怎么查
不能跳过索引中的列,同理,建索引时的列顺序限制
有列的范围查询,则其右边所有列都无法使用索引优化查找
2.4 聚簇索引
聚簇索引是一种数据存储方式InnoDB的聚簇索引实际上在同一个结构中保存了BTree索引和数据行
2.5 覆盖索引
通过索引既可以返回查询的数据列符合覆盖索引时 explain 中的extra中会出现 using index
2.6 summary
通过索引可以看到主要的两个用途:通过索引去查找行
通过索引去排序,由于索引是顺序组织数据的,所以查的时候就按顺序查就可以了
再回到开始的索引的优点
1)大大减少服务器需要扫描的数据量
索引的数据组织方式是一颗树,树的遍历复杂度明显小于全表扫描的复杂度
2)可以帮助服务器避免排序和临时表
索引是顺序组织数据,查询过程可以快速定位要找的数据,无需另外的排序操作
基于索引的order by 和 group by 、distinct操作基本能方便支持,避免临时表的产生
3)可以将随机IO变为顺序IO
索引是顺序组织数据,相关的值会存储在一起
相关文章推荐
- mysql使用高版本登录低版本的时候注意的问题
- MYSQL数据库学习七 视图的操作
- MYSQL Study案例之--RedHat EL55源码安装Mysql-5.6
- MySQL 日志文件 说明
- 关于mysql 1146错误问题
- MySQL 启动故障 处理 小记
- MYSQL大批量删除日志
- mysql怎么让一个存储过程定时执行
- 类型转换对 MySQL 选择索引的影响
- mysql 不能对同一个表进行 update(delete) 和 select 联合操作
- 数据库学习之--RedHat EL55下Mysql源码包安装
- mysql 性能优化方案
- mysql5.5手册读书日记(3)
- 关于mysql的存储过程的使用权限的实验及思考
- MYSQL数据库学习六 索引的操作
- mysql事务的理解
- mybatis对mysql进行分页
- Ubuntu Server下启动/停止/重启MySQL数据库的三种方式
- mysql 中两个日期相减获得 天 小时 分钟 或者 小时:分钟的格式
- mysql结果缓存