mysql基础学习2

时间:2024-12-04 06:59:48

MySQL组成

  • 连接池组件
  • 管理工具
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲组件
  • 存储引擎
  • 物理文件

临时表 临时在内存存在,旨在当前连接可见关闭连接时会自动删除表并释放所有空间 create temporary table xfb(id int); show tables看不到 只能select * from xfb能看到   exit就会删除 其他用户也看不到

一般的表都写在磁盘

复制表 create table copy_teams LIKE teams; 结构一样 没数据

create table copy_teams as select * from city_name ;结构一样而且有数据

 select length(name) from xfb 存储消耗空间

char_length(统计字符长度)

char和varchar区别:

存储区别 存取速度比较快 存储时实际存储的字符长度低于设置的 会在后面自动补齐空格

varchar不会空格补齐 只会填充一个空格

取数据 char取值会把空格去掉 varchar不会去掉空格

允许存储长度 最大255 65535字节

聚合函数:count max min sum avg

如果两个表中一个较小,一个是大表,则子查询表大的用 exists,子查询表小的用 in

enum 枚举类型 只能从定义的里面选

set 集合类型 create table myset(col SET(‘a’,’b’.’c’)) 插入时重复的话只会有一次

union all;

范式  控制数据冗余,对空间节省        

第一范式 (1NF: First Normal Form)

定义:每个表中的每个列都应该是不可再分的最小数据单位,即每个字段都是原子性的,不能包含多个值。确保每列只包含单一值,避免多值列导致的数据冗余和更新异常。

第二范式 (2NF: Second Normal Form)

定义:在满足第一范式的基础上,非主键列完全依赖于主键,而不是部分依赖。

作用:消除部分依赖,避免数据冗余和更新异常。 多写两个表

第三范式 (3NF: Third Normal Form)

定义:在满足第二范式的基础上,非主键列之间不存在传递依赖,即每个非主键列只依赖于主键,而不依赖于其他非主键列。

作用:消除传递依赖,进一步减少数据冗余和更新异常

主从从   主-主从-从 互为主从

主从复制:建立一个和主数据库完全一样的数据库环境叫从数据库 主数据库是实时的

可以做数据的热备份,主数据库服务器故障后,从服务器立即工作,避免数据丢失

可以架构扩展,当业务量大,io访问牝鹿过高,单机无法满足,做多库存储就会降低磁盘访问io的频率,提高单个机器的io性能

使数据库更支撑更大的并发,做到读写分离,在从服务器执行查询工作,降低主服务器压力

master端打开bin-log功能,slave从master端获取相应的二进制日志,然后再自己slave端完全按照顺序执行日志中锁记录的各种操作

主库数据更新到binlog,从库发起连接到主库,主库创建线程将binlog内容发送到从库,从库启动过后,创建一个io进程,读取主库文件并写到中继日志,从库创建sql线程,从中继日志读取内容,将更新内容写入到slave的数据库

主从复制延迟比较慢原因:主机器配置高,从机器配置低,网络延迟高,从服务器读写速度慢并发量大主服务器写慢从服务器读慢

从数据库读的延迟问题:半同步复制(解决数据丢失) 并行复制(解决延迟)

之前主库事务提交后立马将结果返回给客户端,而从库可能没有及时更改,半同步复制:引入确认机制,主库再提交事务后,确认至少有一个从库已经接受并更改再返回给客户端

并行复制:多个线程并行应用日志,可以基于数据库表,将不同的库表分配给不同线程,每个线程独立应用日志,适合表之间没有依赖关系的场景,可以基于事务组,将事务分组,每个组一个线程,事物之间没有依赖关系场景

内连接(inner join):取得两张表中满足存在连接匹配关系的记录。

外连接(outer join):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录。

交叉连接(cross join):显示两张表所有记录–对应,没有匹配关系进行筛选,它是笛卡尔积在SQL中的实现,如果 A 表有 m 行,B 表有 n 行,那么 A 和 B 交叉连接的结果就有 m*n 行。

笛卡尔积:是数学中的一个概念,例如集合 A={a, b},集合 B={0, 1, 2},那么 AXB={<a, 0>, <a, 1>, <a, 2>, <b, 0>, <b, 1>, <b, 2>}。

创建一个新用户:create user ‘xfb’@’localhost’ identified by ‘123456’; %

授权 grant all privileges on database.*( *.*) to ‘xfb’@’%’;   revoke

刷新权限 flush privileges

看权限 show grant for ‘xfb’@...

drop user ‘’

ALTER USER 'john'@'localhost' IDENTIFIED BY 'newpassword456';

如果mysql运行很慢:优化查询,使用explain看查询计划,添加索引

Create index bill.mss_channel_fee_send_order.state_sum on bill.mss_channel_fee_send_order using btree(state_sum)

调整配置:增加缓冲池大小,调整链接数限制

监控性能:使用show processlist 查看当前运行的查询  show global status 查看全局状态

备份表数据:

mysqldump -u username -p dbname old_table > old_table_dump.sql

这将导出名为 old_table 的表的结构和数据到一个名为 old_table_dump.sql 的 SQL 文件。

还原到新的数据库:恢复备份

mysql -u username -p new_dbname < old_table_dump.sql

information_schema 是 MySQL 数据库中的一个系统数据库,它包含有关数据库服务器的元数据信息,这些信息以表的形式存储在 information_schema 数据库中

存储有关数据库的信息,如数据库名、字符集、排序规则等。

SELECT * FROM information_schema.SCHEMATA;
包含有关数据库中所有表的信息,如表名、数据库名、引擎、行数等。

SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database_name';

 insert ignore into  忽略数据库中已经存在的数据

统计重复数据 select count(*) as repetitions,last-name,first-name from … group by last,first having repetions > 1;

导出数据:select … into outfile ‘/tmp/a.txt’用不存在的文件 防止数据被篡改

load data infile将文件数据读取到数据库

导入:source

mysql> create database abc;      # 创建数据库

mysql> use abc;                  # 使用已创建的数据库

mysql> set names utf8;           # 设置编码

mysql> source /home/abc/abc.sql  # 导入备份数据库

函数:

adddate addtime datediff(计算两个日期之间相隔天数)

sql注入

通过网页获取用户输入的数据,并写进数据库 可能发生sql注入安全问题

sql注入:把命令插入到web表单递交或者输入域名或者页面请求中,最终达到欺骗服务器执行恶意的sql命令

对用户输入的数据进行过滤和处理

防范:对用户输入进行适当的验证,给予数据库执行必要操作的最小权限,使用orm框架实现对象关系映射,