MySql介绍
MySQL是关系型数据库,是单进程多线程模型,一个SQL语句无法利用多个cpu core去执行,这也就决定了MySQL比较适合OLTP(特点:大量用户访问、逻辑读,索引扫描,返回少量数据,SQL简单)业务系统
数据库设计
项目开发过程中进行数据库表设计,可以按照以下思路:
1、数据库选型
-
关系型数据库:MySQL
-
非关系型数据库(NoSQL):MongoDB、Redis(key-value)
-
分布式关系数据库:ES(存储文件,用来在海量的数据中进行快速的全文搜索和分析)
2、数据库设计
- 库表设计(字段):需要几张表、有哪些字段
- 索引设计:1.哪些字段加索引、索引怎么加
- 经常查找的列建立索引key
- 约束(唯一性),即哪些字段可以加唯一索引
- 缓存:经常使用的(热数据)存到本地缓存中,提高访问速度。
- MySql存放数据的最大长度:65535字节
库表设计
1.1 存储类型的选择
- 业务合理的情况下,通常越小越好
- 整数:tinyint(1字节)、int(4字节)、bigint(8字节)
- 小数:decimal(9字节)
-
int(1)和int(11)在存储上的区别
- 存储上没有区别,1和11表示的是展示宽度(平时查询不补0是因为默认没有开启补0)
- 所以,使用默认的int(11)、bigint(20)即可。
-
(big)int VS decimal 用哪个?
- big(int),定长小数时,空间小性能好
- decimal,不定长的高精度运算时使用(如,外卖订单钱数)
- varchar和char的选择
- n为字符长度,不同字符集占用长度不同(当前使用的是utf8mb4;平时使用不用考虑字符和字节的转换问题)
-
-
适用场景
-
varchar:1、字符串的最大长度比平均长度大很多,如评论 2、字段更新少(碎片化问题不严重
-
char:1、固定长度数据,如md5值、身份证号 2、对于短的列,char比varchar在存储上更有效率
-
-
1.2 主键设计
- 要有主键,且主键一定要有序:强烈建议使用int/bigint的自增id作为主键,避免使用md5/uuid等无序数据作为主键。
- 有序为什么如此重要
- 读写皆走缓存,减少磁盘IO(数据写到缓存后,一段时间统一写到磁盘一次)
- 有序才能保证顺序IO,提升性能(存储引擎存的时候一定是有序的,主键有序可以减少数据库操作 )
- 无序是随机IO
- 冷热明显的数据有更好的性能
1.3 表设计
范式平衡——没有绝对的对与错,只有适不适合
范式化的更新操作通常比反范式化要快;反范式化的设计可以很好的避免关联
-
高性能反范式,适当的保留聚合字段、增加冗余字段。
-
高复杂度范式,遵守范式保持更好的数据合理性。例如某个流程涉及到十三四张表,遵守范式更合理不易出问题
表设计的优化方式
-
单表的字段个数——少而精(可以以业务为依据,减少表字段,业务拆分)
原因:字段多,IO低效(返回过多无用字段);索引不好复用;耦合严重;单表数据大
-
分库分表
保留充分的读写拓展能力
-
分表
逻辑拆分,最复杂最重要的工作
为分库做数据结构准备
提升读写效率
-
分库
数据库写能力的水平扩展
-
-
缓存表和汇总表
缓存表用来存储可以十分简单但是查询较慢的数据。
汇总表则用来存储由group by产生的聚合数据。
SQL语句注意事项
1、拒绝大SQL和复杂SQL- 大SQL:涉及到的数据量很大
- 复杂SQL:查询语句很复杂
-
高性能、大吞吐服务尽量不使用事务,通过业务保证最终一致性
-
保持事务短小精悍(哪里有需要哪里用)
-
使用原则:即用即开,用完即关
-
避免把事务无关操作放到事务里,减少锁资源的占用
-
不破坏一致性的前提下,使用多个短事务代替长事务
-
-
BAD CASE
-
事务中请求远程服务
-
事务中嵌套事务
-
事务中存在慢查询
-
数据定义语言
数据定义语言(Data Definition Language,DDL),是SQL语言中用于创建或删除数据库、表的语句。这类语句也可以定义数据表对象的主外键、索引等要素。
创建表:
create table dm_item_18
( id int unsigned not null auto_increment comment '自增主键ID',
name varchar(32) not null default '' comment '名称',
primary key (`id`),
unique key `uk_name`(`name`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 comment '标签表';
删除表:
drop table dm_item_18;
drop table if exists dm_item_18;
添加/删除属性:
alter table custom_web_speakers add column secret_key varchar(64) default '' not null comment '加密key';
alter table custom_web_authorization drop column creator;
数据操纵语言
数据操纵语言(Data Manipulation Language, DML)是SQL语言中用于添加、修改、删除数据的语句,需要进行事务提交(commit)。主要语句如下:
插入数据:INSERT - 向数据库表中
更新数据:UPDATE - 更新数据库表中的数据
删除记录:delete from custom_web_authorization where voice_id='afffff';
数据查询语言
数据查询语言(Data Query Language, DQL)是SQL语言中用于对数据库进行查询的语句。主要语句如下:
查询数据:SELECT - 从至少一个数据库表中查询数据

浙公网安备 33010602011771号