MySql索引数据结构以及存储引擎

MySql索引数据结构:

1.二叉树
2.红黑树
3.Hash表
4.B-Tree
二叉树(Binary Search Tree):

存储结构:每个结点最多有两个子树的树结构。子树通常被称为“左子树”(left subtree)和“右子树”(right subtree)。

    1.若左子树不空,则左子树上所有结点的值均小于它的根结点的值
    2.若右子树不空,则右子树上所有结点的值均大于它的根结点的值
    3.左、右子树也分别为二叉排序树
    4.没有键值相等的结点
 || ||

缺点:查询次数多,I/O操作频繁,需从第一个节点往后进行比较,查询效率慢

红黑树(RED/BLACK TREE):

存储结构:二叉查找树,也称为平衡二叉树。

相比于二叉树:查询次数减少,比二叉树查询次数少一半

缺点:红黑树的高度在数据量大时不可控,查询叶子节点时,I/O操作次数也多。

Hash表(Hash Table):

存储结构:维护一个Hash表,以列值计算Hash值,把Hash值和磁盘文件的地址维护到Hash表中,查找时只需进行一次I/O操作。

缺点:范围查询时需全表扫描。

B-TREE:

存储结构:多路平衡树,设定树的高度。

1.叶节点具有相同的深度
2.叶节点的指针为空
3.节点中的数据索引从左到右递增排列

缺点:区间查找问题

B+TREE(B-TREE变种):

存储结构:Mysql使用B+Tree实现索引

1.非叶子节点不存储data,只存储索引,可以放更多索引
2.叶子节点不存储指针
3.顺序访问指针,提高区间访问的性能

MyISAM存储引擎:

索引文件和数据文件分离(非聚集索引)。

非聚集索引:存放引用地址

.FRM .MYD 存储索引表字段值 .MYI存储索引数据值对应引用地址

InnoDB存储引擎:

表数据文件本身按B+Tree组织的一个索引文件

聚集索引:叶节点包含完整的数据记录

.FRM .ibd存储索引数据

Centos安装mysql8.0

注意:本次安装目录为/opt/module/

###下载mysql安装包
[root@chenxi module]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz

###解压安装包
[root@chenxi module]# tar -xf mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz
[root@chenxi module]# mv mysql-8.0.18-linux-glibc2.12-x86_64 mysql
###在/etc目录下创建my.cnf初始文件插入以下并保存
[root@chenxi module]# vim /etc/my.cnf

[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/opt/module/mysql
# 设置mysql数据库的数据的存放目录
datadir=/opt/module/mysql/data
# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8MB4
# 搭建时使用UTF8报出警告如下:
# --character-set-server: 'utf8' is currently an alias for the character
# set UTF8MB3, but will be an alias for UTF8MB4 in a future release.
# Please consider using UTF8MB4 in order to be unambiguous
character-set-server=UTF8MB4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=UTF8MB4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=UTF8MB4

###初始化mysql 
[root@chenxi module]# /opt/module/mysql/bin/mysqld --initialize --user=mysqluser --basedir=/opt/module/mysql/ --datadir=/opt/module/mysql/data/ 

###暂且保留好密码:root@localhost: dj91/8JC%k=Z

###创建用户组和用户并赋予mysql文件夹操作权限
[root@chenxi module]# groupadd mysqlgroup
[root@chenxi module]# useradd mysqluser
[root@chenxi module]# chown -R mysqluser:mysqlgroup /opt/module/mysql

###把启动命令加入到系统服务service管理并授权
[root@chenxi module]# cp support-files/mysql.server /etc/init.d/mysqld
[root@chenxi module]# chmod 755 /etc/init.d/mysqld

###切换用户启动
[root@chenxi module]# su mysqluser

###注意:切换用户如不切换用户启动会报如下错误:(大坑)



[mysqluser@chenxi module]# service mysqld start

###进入mysql(/opt/module/mysql/bin/mysql为mysql安装目录下的bin/mysql)
[mysqluser@chenxi module]# /opt/module/mysql/bin/mysql -uroot -p dj91/8JC%k=Z

###修改当前用户密码、创建新用户并授权、刷新缓存
mysql> alter user user() identified by '密码';
mysql> create user '用户名'@'%' identified by '密码';
mysql> grant all privileges on *.* to '用户名'@'%' with grant option;
mysql> flush privileges;