一、Mysql Linux安装
1、下载mysql rpm工具包上传至服务器: MySQL :: Download MySQL Yum Repository
2、安装mysql yum源:rpm -Uvh mysql80-community-release-el7-9.noarch.rpm
安装成功后会在/etc/yum.repos.d/目录生成mysql repo文件
3、安装mysql:yum install mysql-community-server
4、启动mysql:systemctl start mysqld 或 service mysqld start
5、确定mysql是否启动:systemctl|grep mysql
6、mysql服务配置
1)、查看密码:打开/var/log/mysqld.log文件
2)、修改密码:
2.1、命令:mysql -u root -p 后输入原始密码
2.2、修改密码: ALTER user 'root'@'localhost' IDENTIFIED BY 'Wnsk503220!';
2.3、关闭防火墙或者开放端口
(1)、关闭防火墙:systemclt stop firewalld
(2)、开发端口:
开放3306端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
更新防火墙规则:firewall-cmd --reload
查看防火墙开放端口:firewall-cmd --zone=public --list-ports
2.4、更改mysql远程连接:需要新密码重新登录mysql
登录:mysql -u root -p
password:最新密码
切换数据库:use mysql
更改远程连接:Update user set host='%' where user='root';
2.5、重启mysql:systemctl restart mysqld 或 service mysqld restart
7、连接mysql
1)、navcat连接mysql
2)、提示: Authentication plugin ‘caching_sha2_password’ cannot be loaded的错误。
由于 mysql8 之前的版本采用mysql_native_password 加密规则 , mysql8之后采用caching_sha2_password 加密规则,导致navicat连接失败
3)、还原mysql加密规则
1、进入控制台: mysql -h localhost -u root -p
2、切换数据库:use mysql
3、查看用户密码规则: select user, host, plugin from user;
4、修改加密规则: ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Wnsk503220!';
5、 查看用户密码规则: select user, host, plugin from user;
6、navcat重新连接测试
二、Mysql索引使用
1、InnoDB和MyISAM区别
1)、存储的结构和方式不一样:InnoDB采用聚簇索引(索引和数据是关联在一起),MyISAM采用非聚簇索引(索引和数据文件是分离的,索引保存数据文件的指针)
2)、事务:InnoDB支持,MyISAM不支持
3)、锁:InnoDB支持表级锁和行级锁,MyISAM支持表级锁
表级锁:开销小,加锁快,不会出现死锁;锁定粒度大,发生冲突概率高,并发度最低
行级锁:开销大,枷锁慢,会出现死锁;锁定粒度小,发生冲突概率低,并发度最高
4)、主键:InnoDB必须有主键(默认生成主键索引),MyISAM可以没有
5)、外键约束:InnoDB支持,MyISAM不支持
6)、InnoDB辅助索引和主键索引之间存在层级关系;MyISAM辅助索引和主键索引则是平级关系。因此主键不应该过大,其他索引也相应会很大
5)、故障恢复:InnoDB使用redo和undo日志记录数据修改记录确保数据持久性,数据库异常通过日志可恢复,保证数据的持久性和一致性。MyISAM不支持崩溃恢复
6)、其他:InnoDB不报错表的具体行数,执行select count(*)全表扫描,MyISAM保存整个表行数,执行效率快;InnoDB不支持全文检索(Mysql 5.7版本后也支持了),MyISAM支持全文检索效率高
2、为什么用B+树
1、B+树和B树区别:
1)、B+树只在叶子节点存储数据,B树的非叶子节点也要存储数据。B+树单个节点数据库量更小,在相同的磁盘IO次数下,能查询到更多节点。
2)、B+树叶子节点采用双链表连接,适合mysql基于范围查找,B树无法做到
2、B+树和二叉树区别:
1)、B+树高度能维持在3~4层左右,一次数据查询操作只需3~4次磁盘IO操作,查询夫再度O(logdN);二叉树每个父节点的子节点智能是2个,层数较高,磁盘IO次数较多,查询复杂度O(logN)
3、B+树和Hash区别:
1)、Hash不适合范围查找,适合等职查询O(1)
3、mysql索引优化
1、哪些索引会失效
1)、区分度比较低的字段建立索引
2)、使用like %xx 或者 like %xx%会造成索引失效
3)、使用列运算、函数方法和类型转换
4)、联合索引未遵循最左匹配原则
5)、is null, is not null无法使用索引
6)、负向条件无法使用索引:例如!=、<>、not in、not exists、not like 等
2、具体索引优化建议
1)、union、in、or都能使用索引,建议用in
2)、负向条件无法使用索引,例如not in可以优化成in
3)、联合索引最左匹配原则
1、区分度最高的放在最左边
2、存在非等号和等号混合判断,等号放在前面,例如where a>1 and b=2,把b=2放在前面
4)、where条件多个范围,最多用于左边一个范围列,范围条件有:<、<=、>、>=、between等
5)、索引列不要用任何运算和函数方法
6)、强制类型转换会导致全表扫描,例如字符串字段等于数字
7)、更新频率高于80%不要建立索引,性能和全表扫描相近,count(distinct(列名))/count(*)计算
8)、利用覆盖索引查询,避免回表。查询的列和建立索引的列个数和字段相同,避免select *
9)、索引不会包含有null值的列
10)、is null和is not null 无法使用索引
11)、order by、group by,注意索引的有序性,where a=1 and b=2 and c=3 index(a,b,c);如果索引有范围,有序性无法利用,例如where a>1 order by b
12)、使用段索引(前缀索引):节省磁盘空间和io操作,减少索引文件的维护开销,用count(distinct leftIndex(列名, 索引长度))/count(*) 来计算前缀索引的区分度。缺点是不能用于 ORDER BY 和 GROUP BY 操作,也不能用于覆盖索引
13)、延迟关联和子查询优化分页:当行较深,效率低,改写sql通过id条件过滤
4、java调用存储参数化执行慢,存储重新创建或者执行OPTION(RECOMPILE)
sql语句数据库查询速度很快,java中使用sqlQuery速度很慢--OPTION(RECOMPILE)-CSDN博客