晓看天色暮看云
  • near_me
    首  页
  • view_week
    分  类
    keyboard_arrow_down
    layers
    页  面
    keyboard_arrow_down
  • description 文  章
    35
  • textsms 评  论
    0
  • vincent
    MySQL

    access_time
    brush 1301个字
    whatshot 80 ℃

    MySQL简介

    • MySQL是一个关系型数据库管理系统
    • 优点体积小、速度快、总体拥有成本低

    常用命令

    • SHOW CREATE DATABASE 数据库名 (查看创建数据库的语句)
    • SHOW CREATE TABLE 表名 (查看创建数据表的语句)
    • DESC 表名 (查看数据表结构)

    MyISAM和InnoDB

    • InnoDB默认使用,MyISAM早些年使用的
    MyISAMInnoDB
    事务支持不支持支持
    数据行锁定不支持支持
    外键约束不支持支持
    全文索引支持不支持
    表空间的大小较小较大,约为2倍

    常规使用操作:

    • MyISAM:节约空间,速度较快
    • InnoDB:安全性高,支持事务处理,多表多用户操作
    在物理空间存在的位置
    所有的数据库文件都存在data目录下,本质还是文件的存储!
    MySQL引擎在物理文件上的区别
    • InnoDB在数据库中只有一个*.frm文件,以及上级目录下的 ibd 文件
    • MyISAM对应文件

      • *.frm 表结构的定义文件
      • *.MYD 数据文件(data)
      • *.MYI 索引文件(index)
    设置数据库表的字符集编码
    CHARSET=utf7

    修改和删除表

    -- 修改表名
    ALTER TABLE 旧表名 RENAME AS 新表名
    -- 增加表的字段
    ALTER TABLE 表名 ADD 字段名 列属性
    -- 修改表的字段
    ALTER TABLE 表名 MODIFY 字段名 列属性[] -- 修改约束
    ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[] -- 字段重命名
    -- 删除表的字段
    ALTER TABLE 表名 DROP 字段名
    -- 删除表(如果表存在再删除)
    DROP TABLE IF EXISTS 表名

    所有的创建和删除操作尽量加上判断,以免报错~
    注意点:

    • 字段名使用``包裹!
    • 注释 -- /**/
    • sql关键字大小写不敏感,建议使用小写
    • 所有符号用英文!

    外键

    联表查询

    事务

    什么是事务

    要么成功,要么失败
    例:

    1. SQL执行 A给B转账 A 1000 -> 200 B 200
    2. SQL执行 B收到A的钱 A 800 -> B 400

    将一组SQL放在一个批次中执行

    事务原则:ACID原则,原子性,一致性,隔离性,持久性(脏读,幻读···)
    • 原子性表示,这上面两个步骤一起成功,或者一起失败,不能只发生其中一个动作
    • 一致性表示,事务完成后,符合逻辑运算
    • 持久性表示,事务结束后的数据不随着外界原因导致数据丢失,事务没有提及回复到原状,事务已经提交,持久化到数据库
    • 隔离性表示,针对多个用户同时操作,主要是排除其他事务对这次事务的影响

      • 脏读:指一个事务读取了另外一个事务未提交的数据
      • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同(这个不一定是错误,只是某些场合不对)
      • 虚读(幻读):指在一个事务内读到了别的事务插入的数据,导致前后读取不一致

    执行事务

    mysql默认开启事务自动提交

    -- 手动处理事务
    SET autocommit = 0 -- 关闭自动提交
    -- 事务开启
    START TRANSACTION -- 标记一个事务的开始
    INSERT xx
    INSERT xx
    -- 提交: 持久化(成功)
    COMMIT
    -- 回滚: 回到原来的样子(失败)
    ROLLBACK
    -- 事务结束
    SET autocommit = 1 -- 开启自动提交
    -- 了解
    SAVEPOINT 保存点名 -- 设置一个事务的保存点
    ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
    RELEASE SAVEPOINT 保存点名 -- 撤销保存点

    步骤:

    1. 关闭自动提交
    2. 开启一个事务
    3. 成功就提交,失败就回滚
    4. 开启自动提交

    索引

    MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构

    索引的分类

    • 主键索引(PRIMARY KEY)

      • 唯一的标识,主键不可重复,只能有一个列作为主键
    • 唯一索引(UNIQUE KEY)

      • 避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
    • 常规索引(KEY/Index)

      • 默认的,index/key关键字设置
    • 全文索引(FullINDEX)

      • 在特定数据库引擎才有,MyISAM
      • 快速定位数据

    索引的使用

    -- 显示所有索引信息
    SHOW INDEX FROM 表名
    -- 增加一个全文索引
    ALTER TABLE 数据库名.表名 ADD FULLTEXT INDEX `索引名` (`列名`);
    -- EXPLAIN 分析sql执行状况
    EXPLAIN SELECT * FROM 表名; -- 非全文索引
    EPLAIN SELECT * FROM 表名 WHERE MATCH(索引名) AGAINST(匹配值);

    索引在小数据量的时候,用处不大,但是在大数据量的时候,区别十分明显

    索引原则

    • 索引不是越多越好
    • 不要对经常变动的数据加索引
    • 小数据量的表不需要加索引
    • 索引一般加在常用的查询的字段上
    索引的数据结构
    • Hash类型索引
    • Btree:InnoDB的默认数据结构

    三大范式

    • 第一范式,原子性
    • 第二范式,满足第一范式的前提下,每张表只描述一件事
    • 第三范式,满足第一和第二范式的前提下,需要确保数据表中的每一列数据都和主键直接相关,而不能简介相关

    规范性和性能的问题

    关联查询的表不得超过三张表

    • 考虑商业化的需求和目标,数据库的性能更重要
    • 在规划性能问题的时候,需要适当考虑一下 规范性
    • 故意给某些表增加一些冗余字段,从多张表查询变为单表查询
    • 故意增加一些计算列,从大数据量降低小数据量的查询:索引

    #如无特别声明,该文章均为 vincent 原创,转载请遵循 署名-非商业性使用 4.0 国际(CC BY-NC 4.0) 协议,即转载请注明文章来源。
    #最后编辑时间为: 2023 年 02 月 23 日





    关于 DreamCat

    主题名称:DreamCat | 版本:2.8.221001(LTS)

    主题开发:HanFengA7 | TeddyNight | Dev-Leo | CornWorld | WhiteBearcn | DFFZMXJ

    Designed by HanFengA7 Power by Typecho

    Copyright © 2015-2025 by LychApe All rights reserved!

    加我的QQ
    加我的微博
    加我的支付宝
    加我的微信