MySql介绍

MySQL是关系型数据库,是单进程多线程模型,一个SQL语句无法利用多个cpu core去执行,这也就决定了MySQL比较适合OLTP(特点:大量用户访问、逻辑读,索引扫描,返回少量数据,SQL简单)业务系统

数据库设计

项目开发过程中进行数据库表设计,可以按照以下思路:

1、数据库选型

  • 关系型数据库:MySQL

  •  非关系型数据库(NoSQL):MongoDB、Redis(key-value)

  •  分布式关系数据库:ES(存储文件,用来在海量的数据中进行快速的全文搜索和分析)

2、数据库设计

  • 库表设计(字段):需要几张表、有哪些字段
  • 索引设计:1.哪些字段加索引、索引怎么加 
    • 经常查找的列建立索引key
    • 约束(唯一性),即哪些字段可以加唯一索引
3、其他事项
  • 缓存:经常使用的(热数据)存到本地缓存中,提高访问速度。
  • 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:查询语句很复杂
2、禁大事务出现
  • 高性能、大吞吐服务尽量不使用事务,通过业务保证最终一致性

  • 保持事务短小精悍(哪里有需要哪里用)

    • 使用原则:即用即开,用完即关

    • 避免把事务无关操作放到事务里,减少锁资源的占用

    • 不破坏一致性的前提下,使用多个短事务代替长事务

  • BAD CASE

    • 事务中请求远程服务

    • 事务中嵌套事务

    • 事务中存在慢查询

3、禁止在索引列做运算:在索引列进行数学运算、函数运算,会使查询无法使用索引,导致全表扫描
4、避免负向查询:NOT != < > !< !> NOT EXISTS NOT IN NOT LIKE 等
5、避免使用前缀模糊查询%:如%北京 %北京%,会导致索引失效

数据定义语言

数据定义语言(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 - 从至少一个数据库表中查询数据

posted @ 2024-08-16 14:19  zhegeMaw  阅读(78)  评论(0)    收藏  举报