您的位置:首页 > 数据库 > MySQL

【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+Tree

BTree的数据结构所形成的查询方式,有点像二分查找的感觉,对数据组织是顺序的
从根节点开始,通过比较节点页的值和要找的值找到合适的指针进入下层子节点
每进入一层子节点,相当于一次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
索引是顺序组织数据,相关的值会存储在一起
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: