原文链接:https://juejin.im/post/5a9b6342f265da23a2289281?utm_medium=be&utm_source=weixinqun
char&varchar
char是定长,对于超出长度的字符串,会截断,并且丢弃末尾的空格
char类型再数据变化的时候,会产生数据碎片(data_free)
varchar是变长,会有一个或者两个额外字节保存长度值
blob&text
即smallblob和smalltext,都是为了保存大数据的字符串类型
enum
保存在枚举类型字段里的值都是整型,.frm文件中会保存数字-字符串的映射
datetime×tamp
分别是8个字节和4个字节,并且存储数据的格式都是yyyy-MM-dd HH:mm:ss‘
索引优化:
普通索引 : alter table a add INDEX index_name on column , create INDEX index_name on table_name(column)
唯一索引 : alter table a add UNIQUE INDEX index_name on column, create UNIQUE INDEX index_name on table_name(column)
全文索引 : alter table a add FULLTEXT index_name on column, create FULLTEXT idnex_name on table_name(column)
主键 : primary key
组合索引:遵循最左索引原则,即创建复合索引时应该将最常用(频率)作限制条件的列放在最左边,依次递减。示例:alter table table_name add INDEX index_name (column1, column2)
覆盖索引:指一个查询的结果从索引中即可获取到,而不用去查询表(回表操作),即select字段,where字段,orderby字段,groupby字段都在一个组合索引中,则该索引称为覆盖索引
传统意义上的索引就是指的B+树索引,这是目前关系型数据库系统中查找最为常用和有效的索引,其构造就是采用了二叉树的思想,根据键值对快速找到数据。通过B+树索引找到被查找数据行所在的页,然后数据库把页读入到内存,再在内存中进行查找,找到对应的数据。
对于Hash索引中的所有列,存储引擎都会为该列的每一行计算一个Hash码,Hash索引中存储的就是Hash码。
前缀索引和索引选择性:索引选择性是指某列的不重复索引值与总数的比值。计算:select distinct(column)/count(*) as selectivily from table_name
越接近于1,表示越需要
但是某些字段做联合索引,索引数据会十分庞大,可以使用字段值的一部分作为索引,alter table table_name add INDEX index_name (column1, column2(4))
查询资料:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41849
Mysql查询过程:
1 mysql客户端发送一条sql语句给服务器,如果开启了查询缓存,那么服务器会去缓存里查找,(其实mysql判断缓存是否命中很简单,mysql会把sql语句,mysql版本,数据库名等综合因素生成一个hash值,并把查询结果放在一个引用表中与hash关联,如果当前的查询按照相同规则计算出来hash再引用表中关联,则命中)
2 找到缓存并且用户有权限那么返回缓存结果
3 没有找到分析语句,预处理,优化器优化并生成相应的执行计划
4 按照生成的执行计划调用存储引擎的api
5 将查询结果返回,并缓存起来
6 有些查询语句的结果不能被缓存,比如加入了SQL_NO_CACHE的语句,调用了某些系统/自定义函数,查询系统表(mysql、information_schema),LOCK TABLES READ/WRITE,SELECT FOR UPDATE等
查询资料: http://blog.csdn.net/desilting/article/details/9466629
优化数据访问:
优化数据访问的关键在于:减少数据访问量,只检索必要访问的数据,保证向数据库发出的查询数据量只是实际需要的数据量。
1 使用limit
2 尽量减少select *的使用
3 缓存结果
4 如果需要扫描大量数据,但只需要少量数据,使用覆盖索引减少磁盘的io
重构查询:
1 分解查询
2 优化关联查询的顺序
3 分页页数过多,使用联表和覆盖索引来加速查询
查询资料:http://blog.csdn.net/yejr/article/details/70039403