Mysql之前没学过不会的笔记以及Mysql 5.5 和8.0 区别,安装时候错误的记录

MYISAM 和 INNODB 的区别

在这里插入图片描述
一些常规的操作
MYISAM 节约空间,速度较快
INNODB 安全性高,事务的处理,多表多用户操作
delete 和Truncate 区别
相同点:都能删除数据,都不会删除表结构
不同:
Truncate 重新设置,自增列,计数器会归零
Truncate 不会影响事务
当我们DELETE 删除的问题,重启数据库,现象
如果引擎是InnoDB 自增列会从1 开始(因为是存在内存当中的)
如果引擎是MyISAM 继续从上一个自增量开始(存在文件中的,不会丢掉)
去除重复的关键字

select distinct '字段名' from 表名 

Mysql 中常用的函数

-- 常用的函数
-- 数学的
SELECT ABS(8)  --绝对值
SELECT CEILING(0.1) --向上取整
SELECT FLOOR(8.1)--向下取整
SELECT RAND() --返回一个0~1 之间的随机数
SELECT SIGN(10) --判断一个数的符号 0就是0 负数时-1  正数是 1
-- 字符串函数
SELECT CHAR_LENGTH('我爱憨憨')  --字符串的长度
SELECT CONCAT('我','爱','憨憨')  --拼接字符串
SELECT INSERT('I am  meinv',1,2'very')  --查询加替代
SELECT LOWER('ssssssss')  --小写字母
SELECT UPPER('SSSSSSSSSSSS'--大写字母)
SELECT INSTR('fjj','f') --返回第一次出现的字符串的索引
SELECT REPLACE('我爱憨憨','我','爱','憨憨')  -替换
SELECT SUBSTR(''','','憨憨'',4,6) --返回指定的字符串
SELECT REVERSE('我','爱','憨憨') --反转
--查询某个字段后替换
select replace(字段,'替换前的值','替换后的值') from 表名 where 字段 like '字段%'
-- 时间和日期函数
SELECT CURRENT_DATE --获取当前日期
SELECT CURDATE()--获取当前日期
SELECT NOW() --获取当前的时间
SELECT LOCALTIME() --本地时间
SELECT SYSDATE() --系统时间

聚合函数

count(字段)  --求总和的
count(*),count(1) --之间的区别?
--如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 
--因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化的 因此:count(1)和count(*)基本没有差别! 
--count(1) and count(字段)
--两者的主要区别是
--(1) count(1) 会统计表中的所有的记录数,包含字段为null 的记录。
--(2) count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
--执行效果上:  
--count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL  
--count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL  
--count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,
--统计。
--执行效率上:  
--列名为主键,count(列名)会比count(1)快  
--列名不为主键,count(1)会比count(列名)快  
--如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)  
--如果有主键,则 select count(主键)的执行效率是最优的  
--如果表只有一个字段,则 select count(*)最优。
avg() --平均值
sum() --求总和
max() --最大值
min() --最小值
order by  排序 配合having 使用

MD 5 加密
什么是MD5?
主要增强算法复杂度和不可逆性
MD5 不可逆,具体的值的MD5 是一样的
数据库的特性
原子性:要么都成功,要么都失败
一致性: 事务前后的数据完整性要保持一致
持久性:事务提交,事务一但提交测不可逆,被持久化到数据库中
隔离性:事务隔离级别是多个用户并发访问数据库时,数据库为每个用户开启的事务,不能其他的事务的操作数据所干扰事务之间相互隔离
隔离的级别
未提交读:脏读现象,事务A读取到事务B未提交的数据;

已提交读:不可重复读现象,解决了脏读现象,在同一个事务里面进行两次Select操作,先读取一遍,然后另外一个事务对你读取的数据进行update操作,所以前后两次读取的是两个不同的数据;

可重复读:解决不可重复度现象,幻读现象,事务Aupdate数据库之后得到的数据,事务BInsert了数据库,增加了许多符合事务A查询条件的数据,事务A再次进行读取的时候能读取到符合自己update条件却位update的数据;

串行化:解决所有问题,进行数据操作是不允许其他事务进行对这个数据的任何操作,sync锁;
索引
索引时帮助Mysql 高效获取数据的数据结构
索引就是数据结构
索引的分类
在一个表中主键索引只能有一个,唯一索引可以有多个
主键索引
唯一的标识,主键不可重复,只能有一个列作为主键
唯一索引
避免重复的列出现,唯一索引可以重复,多个列都可以标识,唯一索引
常规索引
默认的,index ,key 关键字来设置的
全文索引
在特定的数据库引擎下才有,MyISAm
快速定位数据

--索引的使用
--1,在创建表的时候给字段增加索引
--2,创建完毕后,增加索引
--显示所有的所有信息
show index from 表名
--增加一个全文索引
alter table 表名  add fulltext index '字段名'(‘索引名’)
explain select * from 表名 --分析sql 执行的状况 

索引的作用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

加上索引后查询的速度快了很多。
我的表结构

CREATE TABLE `test`.`Untitled`  (
  `id` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户昵称',
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户邮箱',
  `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '手机号',
  `gender` tinyint(0) UNSIGNED NULL DEFAULT 0 COMMENT '性别(0:男;1:女)',
  `password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
  `age` tinyint(0) NULL DEFAULT 0 COMMENT '年龄',
  `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0),
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'app用户表' ROW_FORMAT = Dynamic;
-- --查看数据库有多少数据
select count(1) from app_user
-- 当我们查询一个手机号的时候
SELECT * FROM app_user WHERE phone  ='13817917100';
-- --查看
EXPLAIN select * from app_user WHERE phone ='13817917100'
-- 给phone 字段添加一行索引
CREATE INDEX id_app_user_phone ON app_user(phone)
-- --查看
EXPLAIN select * from app_user WHERE phone ='13817917100'

Mysql 5.5 和Mysql 8.0 区别
这个是我今天下午发现的,原来我一直用的5.5 ,在写关于时间戳的问题的时候我发现5.5 不可以这样写,在这里插入图片描述
我就没事百度了一下区别。顺便安装了一下mysql 最新的版本/
安装时候遇到的错误吧
在这里插入图片描述
修改my.ini
在这里插入图片描述
第二个错误是因为没有用管理员的身份打开cmd 导致下载的mysql 的时候一直报错
最后一定要记住他默认生成的密码,用可视化工具打开会提示你换新的密码
安装完后先是在建表的时候看到了这个
在这里插入图片描述
了解了才知道原来他是直接从5.7 直接就跳到了8.0 . 据说性能提升了很多具体我也不知道。只总结了下面的这点
在这里插入图片描述

账户安全
老版本的命令

grant all privileges on *.* to '用户名'@'主机' identified by '密码'

新版本就需要分开执行

create user '用户名'@'主机' identified by '密码';
grant all privileges on *.* to '用户名'@'主机';

用之前的会报错
优化器索引
1,就是看到的那个隐藏的索引(invisible index)
隐藏索引不会被优化器使用

应用场景
软删除
删除索引,如果删除错了索引,只能通过索引的方式将其添加回来,对于一些大的数据库而言,是比较耗性能的;为了避免删错,可以先将其设置为不可见,优化器这时候就不会使用它,但是后台仍然在维护,确定后,再删除。
灰度发布
与软删除差不多,如果想测试一些索引的功能或者随后可能会使用到这个索引,可以先设置为隐藏索引,对于现有的查询不会有影响,测试后确定需要该索引,可以将其设置成可见索引。
命令

--如果是不隐藏,则不需要后面的invisible关键字
create index 索引名称 on 表名(字段名) invisible;
--查询某一张表的索引,执行如下命令:
show index from 表名
--使用explain语句查看查询优化器对索引的使用情况
explain select * from 表名 where 条件;
--设置已经存在的索引为可见或者隐藏 
alter table 表名 alter index 索引名 visible;
alter table 表名 alter index 索引名 invisible;

主键不可以设置为隐藏
2.降序索引
Mysql 8.0 开始真正支持降序索引,只有InnoDB 引擎支持降序所以又必须是BTREE 降序索引,Mysql 8.0 不在对group by 操作进行隐式排序
3,函数索引
索引中使用函数表达式
支持json 数据节点的索引是基于 虚拟列的功能实现的
窗口函数
1原子ddl 操作
MySQL5.7执行drop命令 drop table t1,t2; 如果t1存在,t2不存在,会提示t2表不存在,但是t1表仍然会被删除。
MySQL8.0执行同样的drop命令,会提示t2表不存在,而且t1表不会被删除,保证了原子性。
2,自增列持久化
  MySQL5.7及其以前的版本,MySQL服务器重启,会重新扫描表的主键最大值,如果之前已经删除过id=100的数据,但是表中当前记录的最大值如果是99,那么经过扫描,下一条记录的id是100,而不是101。
  
  MySQL8.0则是每次在变化的时候,都会将自增计数器的最大值写入redo log,同时在每次检查点将其写入引擎私有的系统表。则不会出现自增主键重复的问题。
  索引的原则
  索引不是越多越好
  不要对进程变动数据加索引
  小数据量的表不需要加索引
  索引一般加在常用来查询的字段上

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值