深入浅出的学习深入浅出的学习Mysql
前言前言
数据库一直是笔者比较薄弱的地方,结合自己的使用经验(python+sqlalchemy)等做个记录,笔者比较喜欢使用ORM,一直感
觉拼sql是一件比较痛苦的事情(主要是不擅长sql),以前维护项的目中也遇到过一些数据库的坑,比如编码问题,浮点数精度
损失等,防止以后重复踩坑。
1章:使用帮助章:使用帮助
使用mysql内置的帮助命令
msyql> ? data types : 查看数据类型
mysql> ? int
mysql> ? create table
2章:表类型(存储引擎)的选择章:表类型(存储引擎)的选择
最常用的两种引擎最常用的两种引擎:
1、Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。 每个MyISAM 在磁盘上
存储成三个文件。文件名都和表名相同,扩展名分别是 .frm (存储表定义) 、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索
引)。数据文件和 索引文件可以放置在不同的目录,平均分布io,获得更快的速度。
2、InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比 Myisam 的存储引擎,InnoDB 写的处理效率
差一些并且会占用更多的磁盘空间以保留数据和索引。
常用环境常用环境:
1、MyISAM: 默认的 MySQL 插件式存储引擎, 它是在 Web、 数据仓储和其他应用环境下最常
使用的存储引擎之一
2、InnoDB:用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。
3章:选择合适的数据类型章:选择合适的数据类型
首先选择合适的存储引擎,根据指定的存储引擎确定合适的数据类型。
MyISAM: 最好使用固定长度的数据列代替可变长度的数据列。
InnoDB: 建议使用varchar
需要注意的一些数据类型:需要注意的一些数据类型:
1、char与varchar: 保存和检索方式不同,最大长度和是否尾部空格被保留也不同。char固定长度,长度不够用空格填充,获
取时如果没有设置 PAD_CHAR_TO_FULL_LENGTH默认去除尾部空格。
varchar变长字符串,检索时尾部空格会被保留。注意查询时候不区分大小写,如果用sqlalchemy区分大小写不要
用func.binary函数。
2、text和blob: text和blob执行大量的更新或者删除的时候会留下很大『空洞』,建议定期用OPTIMIZE TABLE功能对这类表碎
片整理。避免检索大型的blob或text值 。把text和blob列分离到单独的表中。
3、浮点数float与定点数decimal:
注意几个点:注意几个点:
1.浮点数虽然能表示更大的数据范围,但是有误差问题。
2.对货币等精度敏感的问题,应使用定点数存储。之前项目踩过坑,结果不得不用放大和缩小倍数的方法解决,比较
ugly。
3.编程如果遇到浮点数,注意误差问题,尽量避免浮点数比较(比较浮点数需要作差小于一个特定精度),python3.5中可
以这么比较:float_eq = partial(math.isclose, rel_tol=1e-09, abs_tol=0.0)
4.注意浮点数中一些特殊值的处理。
4章:字符集章:字符集
一开始要选择合适的字符集,否则后期更换代价很高。python2中字符集就是个老大难问题,困然很多新手。之前维护过的项
目使用了msyql默认的latin1字符集,导致每次写入的时候都要对字符串手动encode成utf8。最近用python3.5+flask做项目直接
使用utf8,再也没碰到过编码问题:
创建数据库使用utf8,CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;