mysql索引与innodb结构

1. innodb表空间逻辑结构
表空间:
共享表空间:

数据库的所有表的数据和索引文件都放在一个文件下,默认的文件是 .ibdata1文件,初始值是10M,默认是存放在数据文件(data目录)的根目录下。

缺点:

1.数据表出现大量删除操作,会造成数据空隙

2.空间分配后不回缩

独享表空间:

每一张表都会生成独立的文件来进行存储,每一张表都有一个.ibd文件。其中ibd文件包括了单独一个表的数据内容和索引内容。

优点:

1.每一表都有自己独立的表空间

2.每个表的数据和索引都会存在自己的表空间中

3.可以实现单表在不同的数据库中移动

4.空间可以回收

缺点:

单表增加过大,当单表占用空间过大时,存储空间不足

show variables like "%innodb%";

| innodb_file_per_table                    | ON     --on表示为独享表空间  off表示为共享表空间

set global innodb_file_per_table = "OFF"; // 关闭操作
错误:Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

错误原因:无法连接mysql服务,没找到'/tmp/mysql.sock' 文件,重启mysql服务

解决方法:

1.查看/etc/my.cnf文件是否配置了socket = /tmp/mysql.sock,如果有

2.查看/tmp/mysql.sock是否存在,如果存在

3.重启mysql服务,即:运行 service mysql restart

错误:

刚安装的时候出现:Access denied for user 'root'@'localhost' (using password: YES)

错误原因:密码输入错误

解决方法:

1.service mysql start --重启mysql服务

2.cat /usr/local/mysql/data/error.err --进入错误日志查看密码

3.复制完整密码::VNe*we=/4-p

2022-04-01T14:55:49.369826Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: :VNe*we=/4-p

4.mysql -uroot -p --连接mysql,输入完整密码

[root@localhost data]# mysql -uroot -p
Enter password: 

5.修改密码 --alter user 'root'@'localhost' identified by 'root';

2. Innodb的结构与缓存池

LRU算法解释:

(1)页已经在缓冲池里,那就只做“移至” LRU头部的动作,而没有页被淘汰;

3. 平衡多路二叉树
二分法:

不断选择一个元素作为中位数比较左边的元素小于中位数,右边的元素大于中位数。

比如,下面这串数字:

1,3,5,7,9

如果我们给这个二叉树新增几个数据进去。

比如,这串数字:1,3,5,7,9,11,13

我们新增了数据11,13二叉树会随着数据的新增而进行重构,以此保证我们查询任何数据都是性能最佳的

不建议在一个表中建立太多的索引

4. Btree与B+tree的区别
Btree

Btree是一种多路平衡搜索树,它类似普通的二叉树,但是Btree运行每个节点具备更多的子节点。

B+Tree

B+Tree在Btree的基础上进行了修改,具体结构如下所示:  

mysql> show variables like "innodb_page_size";--查询叶子节点的值
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.13 sec)
特点:

非叶子节点只存key的值,所有的值存在叶子节点。

PreorderTraversal.php 

<?php

class PreorderTraversal
{
    public $data;
    private function LeftSelect($root)
    {
        $stack = array();
        $tree = $root;
        while (!empty($stack) || $tree != null) {
            while ($tree != null) {
                array_push($stack,$tree);
                $tree = $tree["left"];
            }
            $tree = array_pop($stack);
            $this->data[] = $tree["data"];

            $tree = $tree["right"];
        }
    }
    public function getData($root)
    {
        $this->LeftSelect($root);
        return $this->data;
    }
}

btree.php

<?php
include_once "PreorderTraversal.php";

class btree
{
    public $left = null;

    public $right = null;

    public $tree = null;

    public $parent = null;

    public function AddNode($data)
    {
        $preorderTraversal = new PreorderTraversal();
        $array = $preorderTraversal -> getData($this->tree);
        $array[] = $data;
        $this ->tree = $this->TreeNodeAdd($array);
    }

    private function TreeNodeAdd($data){
        if (is_null($data)){
            return;
        }
        sort($data);
        $count = count($data);
        $ceil = ceil($count/2);
        $mod = $count % 2;
        $root = array();
        if ($mod != 0){
            $ceil--;
        }
        if ($count == 1){
            return[
                'data' => $data[0],
                'left' => null,
            ];
        }elseif ($count == 2){
            return[
                'data' => $data[1],
                "left" => [
                    "data" => $data[0],
                    "left" => null,
                    "right" => null,
                ],
                "right" => null,
            ];
        }else{

            $root["data"] = $data[$ceil];
            $LeftNode = array();
            for ($i = 0; $i < $ceil; $i++){
                if (!$data[$i] == null){
                    $LeftNode[] = $data[$i];
                }
            }
            $root["left"] = $this->TreeNodeAdd($LeftNode);
            $RightNode = array();
            for ($i = $count-1; $i > $ceil; $i--){
                if (!$data[$i] == null){
                    $RightNode[] = $data[$i];
                }
            }
            $root["right"] = $this->TreeNodeAdd($RightNode);
        }
        return $root;
    }

    public function getTree()
    {
        return $this->tree;
    }
}

index.php

<?php
include_once "btree.php";
$Btree = new btree();
$Btree->AddNode(1);
var_dump($Btree->getTree());
$Btree->AddNode(3);
var_dump($Btree->getTree());
$Btree->AddNode(5);
var_dump($Btree->getTree());
$Btree->AddNode(7);
var_dump($Btree->getTree());
$Btree->AddNode(9);
var_dump($Btree->getTree());
$Btree->AddNode(11);
var_dump($Btree->getTree());
$Btree->AddNode(13);
var_dump($Btree->getTree());
  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值