【大概流程 】用户登陆 》 选购商品 》 加入购物车 》 检查库存 》提交订单 》 选择在线支付 或 选择货到付款 》 发货 mysql
【用户模块】注册 登录 nginx
【商品模块】先后台商品管理和浏览sql
【订单模块】订单及购物车的生成管理数据库
【仓配模块】仓库库存和物流管理缓存
【数据库实际开发模式】直接确立表名 字段 数据类型 。并发
【数据库设计规范】运维
Mysql5.5 早期存储引擎 Myisam 表,现代选择 Innodb(支持事务、行级锁、更好的恢复性、高并发)。数据库设计
统一字符集 UTF-8 (mysql utf-8 汉字占3字节 ,ascii占1字节 )函数
全部表和字段 都要 comment ,维护数据字典。高并发
【单表数据量】控制在 500万行内,易于修改表结构、备份、恢复 。
【控制手段】历史数据归档、分库分表。
【谨慎使用 mysql 分区表】物理上表现为多个文件,在逻辑上为一个表。选择好分区键可致使跨分区查询效率更低。
【建议物理分表】适合大数据,IO
尽可能冷热数据分离,减小表的宽度(最大4096列),
目的减小磁盘IO保证热数据的内存缓存命中率,避免往缓存读入无用的冷数据。
一般表现为 【常常使用的列放到一块儿,减小关联查询】
预留字段的危害 , 自己数据类型、命名都是模糊的,若是修改预留字段,致使表的锁定,得不偿失。
二进制数据(图片、文件)不是存在数据库的,使用vsftpd +nginx 。
禁止在线上作数据库压力测试,应该用专用压力环境,毕竟有垃圾数据。开发 测试 生产 应该隔离。
① 命名 统一小写字母并用下划线分割。
长度不超过32个字符 库 mc_userdb 表 user_account
临时库表 tmp+日期
备份表 bak+日期
========================================
字段 类型、约束 怎么肯定?
~ 尽可能全部列 NOT NULL
比较和计算 须要判断
~ 符合需求节省空间
【第一 】将字符串转成数字类型存储 INET_ATON('255.255.255.255') = 429496729,
【第二】不可能负数的 就直接使用无符号类型,多一倍空间,4字节。
【第三】VARCHAR(N) N是字符(N个汉字),而非字节数。 Mysql_UTF8 varchar(255) = 765字节。
~ 避免使用 TEXT BLOB数据类型 ,扔到扩展表中(TEXT 不实用 实际 VARCHAR够了)。
限制:只能用前缀索引
~ 避免使用 ENUM 数据类型
限制:使用ALTER语句修改值
缺点:ORDER BY 效率降低,须要额外操做
~ 避免 用字符串存储日期型数据 , 不能使用日期函数计算比较。
应该:TIMESTAMP(1970~2038年) 或 DATETIME
~ 商业数据 DECIMAL (科学计算才用 float double)
优势:比 bigint 更大
========================================================
② 索引(primary index unique )
单表索引不要超过5个。(下降 Mysql 优化查询效率 致使 插入、更新下降)
~ 充分利用已经有的索引
left join 或 not exists 来优化 not in 操做
Innodb按照 【主键索引】顺序组织表。
【建议使用自增ID值】主键不使用 UUID、MD五、HASH、字符串列,不是顺序增加。
【判断是否加索引经验】
① SELECT UPDATE DELETE 的 WHERE
② ORDER BY 、GROUP BY、DISTINCT 的 字段。
③ 须要 JOIN操做 的关联列。
联合索引列顺序怎么安排?
1 最明确区分放在最左侧
2 长度小的列放在最左侧
3 最频繁的列放在左侧
【频繁的查询 覆盖索引】包含全部查询字段的索引。
避免了 Innodb表进行索引二次查找。
把随机IO变成顺序IO加快查询。
【尽可能避免使用外键】不使用外键约束,把关联列创建索引,剩下交给程序。
自己外键用来保证数据参照完整性,但实际仍是业务为主/
还会影响 父表和子表的 写操做下降性能。
==============================
③ sql 面向开发人员
【预编译语句】可维护、可分发
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; SET @a = 3; SET @b = 4; EXECUTE stmt1 USING @a,@b; DEALLOCATE PREPARE stmt1;
~ 避免数据类型隐式转换
select name,phone from user where id = '111' 致使索引失效。
不一样库要不一样的帐号。
不容许 select * 。
把子查询优化成 join 。(由于子查询结果集没法使用索引、临时表数据量大影响大)
每 join 一份表会产生 join_buffer_size 。
【分页】数据库适合批量一次性操做。
【in 代替 or 】in值不该超过500,有效利用索引。
【不宜 order by rand()】随机排序,所有都放到内存!放到程序去排序。
【WHERE从句使用函数、计算】致使索引失效。
索引X where date(createtime) = '20160901'
索引O where createtime >= '20160901' and createtime < '20160902'
明显没有重复值【Union ALL】 【Union】产生临时表。
MYSQL 一个大sql只能使用一个CPU。
④ 方便运维 数据库操做规范。
【主从延迟】 【大事务】【日志多】超过100万条数据,应该分批屡次进行操做。
【大表工具】使用 pt-online-schema-change修改表结构。
【最大链接数限制】容许1个有super权限用户链接 DBA 专用。
程序不能有 drop 权限。