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

本文主要是介绍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,同时在每次检查点将其写入引擎私有的系统表。则不会出现自增主键重复的问题。
  索引的原则
  索引不是越多越好
  不要对进程变动数据加索引
  小数据量的表不需要加索引
  索引一般加在常用来查询的字段上

这篇关于Mysql之前没学过不会的笔记以及Mysql 5.5 和8.0 区别,安装时候错误的记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210301

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys