mysql的访问路径_SQL调优之十:访问路径(Access Path)一

简介

访问路径是指查询过程获取数据的方式,比如说全表扫描,亦或是索引范围扫描。

访问路径介绍

访问路径每一次只对应一个数据集,这个跟连接过程需要两个数据集是不一样的。

对于不同的关系型数据结构,数据库会采用不同的访问路径:

访问路径

堆组织表(无索引)

B树索引和索引组织表

位图索引

表聚簇

Full Table Scans

y

Table Access By Rowid

y

Sample Table Scans

y

Index Unique Scans

y

Index Range Scans

y

Index Full Scans

y

Index Fast Full Scans

y

Index Skip Scans

y

Index Join Scans

y

Bitmap Index Single Value

y

Bitmap Index Range Scans

y

Bitmap Merge

y

Cluster Scans

y

Hash Scans

y

一般来说,当要获取一个数据集里面的一小部分的时候,使用索引的访问路径的效率要高一点。相反的,如果要获取的是数据集的大部分内容,则全表扫描可能会更好。

表的访问路径

表是oracle数据库中数据组织的基本单元。

关系型表是最常见的表类型:

堆组织表,行数据不以特定顺序存储

索引组织表,数据按主键值排序

外部表,只读表,表的元数据存储在数据库内部,但数据存储在数据的外部

接下来的内容主要讲的是关于堆组织表的访问

关于堆组织表的访问

一般来说,我们创建的表默认是堆组织表。每次用户往里面插入数据的时候,数据库会把它们放在找到的第一个可用的空闲空间,因此数据的存放和获取顺序都是随机的。

数据块和段中的行存储

数据库将数据存储在数据块(block)中。在表里面,数据库把行数据写到数据块的底部。然后使用数据块的头部来管理数据块本身,比如说行路径和表路径。

分区(extent)是由逻辑连续的数据块组成的,这些数据库在物理上可能不是连续的。

段(segment)则是一个表空间里面一个逻辑存储结构,比如说表。它可以由多个分区组成。同样的,索引也是一个逻辑存储结构,它也构成了一个段,可以由一个或多个分区组成。

默认的,对于普通的,本地管理的表空间,数据库使用自动段空间管理(ASSM)。

当一个会话第一次往一个表里面插入数据的时候,数据库会格式化一个位图块。位图块会追踪段里面的数据块。

数据库使用这一位图来查找空闲块,然后在往数据块里面写数据之前对其进行格式化。

ASSM会在多个数据块之间展开插入操作来避免并发性问题。

高水位是一个段里面标志了哪些数据块没有格式化过并且从来没有被使用过。

在高水位以下的数据块,可能是已经格式化并且写入了数据的,格式化了但还是空的,或者没有格式化的。低高水位(low high water mark)以下则表示哪些数据块是已经被格式化了,表示它们当前有数据,或者之前有数据。

在一次全表扫描的过程中,数据库会读取低位高水位以下的所有数据块,然后再去读取段的位图,来判断在HWM和low HWM之间有哪些格式化了的数据块可以被读取。

数据库不会去读HWM以上的数据块,毕竟还没格式化。

ROWID对于访问路径的重要性

堆表的每一行都有一个唯一的rowid指向该行的物理地址。rowid是行的一个10byte的物理地址。

它指向一个特定的文件,块和行编号。

比如说,AAAPecAAFAAAABSAAA,最后的AAA表示行编号。它可以用来索引一个行路径记录。

而行路径记录里面则包含了指向行在数据块中的位置的指针。

数据库有些时候可以移动在数据块底部的行数据。

比如说,如果启用了row movement,那么当更新分区键,flashback table操作,shrink table操作的时候,行就可以被移动。

如果数据库只是在数据块内部移动行,那么数据库会更新行路径记录来修改指针。rowid保持不变。

oracle数据库内部使用rowid作为索引的结构。

比如说,B树索引的每一个键都会关联一个rowid,来指向相关行的地址。

物理rowid提供了最快访问表行的可能性,允许数据库通过单次I/O来获得行数据。

物理rowid存储了堆表、表聚簇、表分区和索引分区的行的地址

逻辑rowid存储的是索引组织表的行的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mac OS X 10.15 下源码安装 mysql-8.0.20-macos10.15-x86_64 https://my.oschina.net/kinglyphp/blog/4281112 博客地址 下载mysql-8.0.20-macos10.15-x86_64.tar.gz 可以从mysql官网下载,如果比较慢, 从https://download.csdn.net/download/long4512524/12427861 中下载 解压 tar zxvf mysql-8.0.20-macos10.15-x86_64.tar.gz 移动解压后的二进制包到安装目录 sudo mv mysql-8.0.20-macos10.15-x86_64 /usr/local/mysql 在 /usr/local/mysql 目录新建 data目录文件 cd /usr/local/mysql sudo mkdir data 更改 mysql 安装目录所属用户与用户组 cd /usr/local sudo chown -R root:wheel mysql 在启动 mysql 之前,我们先需要指定my.cnf 文件 因为 mysql 5.7 版本开始 my-default.cnf 文件不会自带,需要手动创建。 cd /usr/local/mysql/support-files sudo vi my-default.cnf 在 /usr/local/mysql/support-files 目录下创建 my-default.cnf [mysqld] basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 socket = /usr/local/mysql/data/mysql.sock log-error = /usr/local/mysql/data/mysqld.log [client] socket=/usr/local/mysql/data/mysql.sock 拷贝my-default.cnf到/etc/my.cnf sudo cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf 初始化 mysqld cd /usr/local/mysql sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 其中: basedir 是指你的mysql安装在哪儿了。 (具体需要换成你自己的路径) datadir 是指MySQL后续的数据存放在哪儿。(具体需要换成你自己的路径) 注意: 这儿执行完会生成mysql root账号的密码,后面在客户端连接时,5.7版本需要用到,自己别忘了记录下 类似这种: 其中 Wt#GeUu_q2oJ 就是root的密码。 [Note] A temporary password is generated for root@localhost: Wt#GeUu_q2oJ 启动MYSQL cd /usr/local/mysql sudo support-files/mysql.server start 如下: kingly@192 data % cd /usr/local/mysql kingly@192 mysql % sudo support-files/mysql.server start Starting MySQL . SUCCESS! 对应mysqld 启动起来接口 ps aux | grep mysqld 见到如下所示,证明mysql安装成功。 kingly@192 mysql % ps aux | grep mysqld kingly 40915 0.6 0.0 4285708 724 s000 S+ 5:47下午 0:00.00 grep --color=auto mysqld _mysql 40907 0.4 2.1 4907248 350300 s000 S 5:46下午 0:00.95 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/mysqld.log --pid-file=/usr/local/mysql/data/192.168.0.103.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306 使用 之前的记住的 Wt#GeUu_q2oJ的密码,测试mysql的链接情况 /usr/local/mysql/bin/mysql -uroot -P3306 -p kingly@192 bin % /usr/local/mysql/bin/mysql -uroot -P3306 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.20 Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 修改root密码,并为 PASSWORD EXPIRE NEVER 永不过期 mysql> alter user 'root'@'localhost' identified by '12345678' PASSWORD EXPIRE NEVER; mysql> flush privileges; mysql> quit; 设置远程访问 允许root用户在任何地方进行远程登录,并具有所有库任何操作权限。 如果出现 提示”Access denied for user ‘root’@’localhost’ (using password: YES)” mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select user,host from user; +------------------+-----------+ | user | host | +------------------+-----------+ | epass | % | | epass | localhost | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+-----------+ 6 rows in set (0.00 sec) mysql> 发现root只有本地权限, 那么, 我们需要给root 加上 127.0.0.1,% 还有指定服务器ip访问的权限, 注意: mysql版本8.0.13,在给新用户授权时,发生了变化 如果出现, 不能直接使用 grant all privileges on *.* to root@'%' identified by '12345678'; //给mysql用户分配远程访问权限 会出现, You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by "12345678"' at line 1 的错误,原因是新版本mysql版本把将创建账户和赋予权限分开了。 应该如下操作: mysql> use mysql; mysql> create user 'root'@'%' identified by 'password'; mysql> grant all privileges on *.* to 'root'@'%' with grant option; mysql> flush privileges; 如果使用 Navicat连接MySQL Server8.0版本时出现Client does not support authentication protocol requested by server; 解决办法: mysql> use mysql; mysql> alter user 'root'@'localhost' identified with mysql_native_password by '12345678'; mysql> flush privileges; 如上即可。 加入环境变量,编辑 /etc/profile,这样可以在任何地方用mysql命令了 sudo vi ~/.bash_profile 添加 export PATH=$PATH:/usr/local/mysql//bin 使~/.bash_profile环境变量生效 source ~/.bash_profile 这个就可以在 任何地方用 mysql 命令了。 mysql -uroot -p 启动、重启与停止,状态 启动 sudo /usr/local/mysql/support-files/mysql.server start 重启 sudo /usr/local/mysql/support-files/mysql.server restart 停止 sudo /usr/local/mysql/support-files/mysql.server stop 查看状态 sudo /usr/local/mysql/support-files/mysql.server status

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值