前言
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
常用技巧优化的数据类型
优先确认数据类型
更小的通常更好
简单就好
尽量避免使用NULL
备注:例如:DATETIME和TIMESTAMP列都可以存储相同类型的数据:时间和日期,精确到秒。然而TIMESTAMP只使用DATETIME一半的存储空间,并且会根据时区变化,具有特殊的自动更新能力。另一方面,TIMESTAMP允许的时间范围要小很多,有时候它的特殊能力会成为障碍。
遵循数据库设计的三大范式
第一范式
第二范式
第三范式
总结
范式优点:
范式缺点:
schema设计简单原则
尽量避免过度设计,例如会导致极其复杂查询的schema设计,或者有很多列的表设计;
使用小而简单的合适数据类型,除非真是数据模型中有确切的需要,否则应该尽可能地避免使用NULL值
尽量使用相同的数据类型存储相似或相关的值,尤其是要在关联条件中使用的列;
注意可变长字符串,其在临时表或者排序时可能悲观的按最大长度分配内存
尽量使用整型标识列
避免使用mysql已经遗弃的特性,例如指定浮点数的精度(可用decimal代替),或者整数的显示宽度
小心使用ENUM和SET,尽量避免使用;避免使用BIT;
创建高性能索引
高性能的索引策略
独立的列我们通常会看到一些查询不当地使用索引,或者使得MySQL无法使用已有的索引。如果查询中的列不是独立的,则MySQL就不会使用索引。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数。
前缀索引和索引的选择性有时候需要索引很长的字符列,这会让索引变得大且慢。一个策略是前面提到过的模拟哈希索引。通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率,但是也会降低索引的选择性。(索引选择性是指不重复的索引值和数据表的记录总数的比值)索引的选择性越高则查询效率越高。
多列索引一个常见的错误是:为每个列创建独立的索引,或者按照错误的顺序创建索引。但实际上,在多个列上建立独立的单列索引大部分情况下并不能提高MySQL的查询性能。5.0和之后的版本引入“索引合并”的策略,一定程度上缓解了这个问题。(但没有彻底解决)
索引合并策略有时候是一种优化的结果,但实际上更多时候则说明了表上的索引很糟糕
当出现服务器对多个索引做相交操作的时候,意味着需要一个包含所有相关列的多列索引而不是多个独立的单列索引
对于如何建立索引列的顺序有一个经验法则:将选择性最高的列放到索引最前面。
2 索引的优点
缺点
备注:因为索引非常占内存,所以索引也需要谨慎添加,那些字段需要索引。
mysql查询生命周期
客户端发送一条查询给服务器
服务器先查询缓存,如果命中了缓存,直接返回结果;否则,进入下一步;
服务器进行sql解析、预处理,再由优化器生成对应的执行计划;
mysql根据优化器生成的执行计划,再调用存储引擎API来执行查询;
将查询结果返回给客户端;
查询性能优化
1、慢查询基础:优化数据访问
低效查询分析方法:
低效查询典型案列:
衡量查询开销的三个指标:
将查询方式进行重构
关注我们
可以关注“IT实战联盟”公众号并留言也可以加入交流群和作者互撩哦~~~
领取专属 10元无门槛券
私享最新 技术干货