• [热门活动] 7天玩转MySQL基础实战营 轻松掌握MySQL,7月15日开课,抓紧时间报名啦
  • [应用开发] MDC平台上是否可以使用MySQL?
    之前的代码中使用到了MySQL数据库,想请问一下通过MDC平台运行代码的时候是否支持连接MySQL?
  • Kunpeng 920数据库解决方案 MySQL 8.0.19软件移植指导书&官网安装指导文档纠错
    1 软件介绍MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。   2 预置条件2.1 硬件配置本文档TaiShan 2280 200基于硬件环境展开。2.2 软件环境1、  本文档基于新安装的CentOS Linux release 7.6.1810系统环境展开。2、  系统安装时选择了Development Tools套件。                                               3 配置环境3.1 关闭防火墙并取消开机自启动#systemctl stop firewalld.service#systemctl disable firewalld.service              (测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置)3.2 修改SELINUX为disabled执行:#sed -i 's/SELINUX=enforcing/SELINUX=disable/g' /etc/sysconfig/selinux 3.3 搭建数据盘如数据目录使用单独硬盘,需要对磁盘进行格式化并挂载1、  创建分区(以/dev/sdb为例,根据实际情况创建)#fdisk /dev/sdb分别输入:n 回车确认;p 回车确认;1 回车确认;按默认配置 回车;默认配置 回车;w 回车保存。2、  创建文件系统(以xfs为例,根据实际需求创建文件系统)#mkfs.xfs /dev/sdb13、  挂载分区到/data以供操作系统使用#mkdir /data#mount /dev/sdb1 /data4、  编辑/etc/fstab使重启后自动挂载数据盘,添加如下标红行,其中/dev/nvme6n1替换为对应分区名称,如/dev/sdb1 3.4 创建用户、组和目录服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离1、  创建mysql用户(组)#groupadd mysql#useradd -g mysql mysql2、  设置mysql用户密码#passwd mysql重复输入密码(根据实际需求设置密码)3、  创建进程所需的相关目录并授权mysql用户(组)#mkdir -p /data/mysql/#cd /data/mysql #mkdir data tmp run log#chown -R mysql:mysql /data /mysql4 安装运行Mysql支持多种安装方式:RPM安装、编译安装等,本文只介绍编译安装。 4.1 编译安装4.1.1 依赖包下载安装I. 配置本地yum库1、  执行命令备份原yum库文件并将新配置写入repo文件:#mv /etc/yum.repos.d/ /etc/yum.repos.d-bak#mkdir /etc/yum.repos.d#echo -e "[local]\nname=local\nbaseurl=file:///mnt\ngpgcheck=0\nenabled=1" > /etc/yum.repos.d/local.repo2、  执行cat确认上一步操作写入成功,显示如下图#cat /etc/yum.repos.d/local.repoII. 挂载OS镜像文件需要在KVM挂载镜像或者上传OS镜像至系统,即执行1或者2。1、  KVM挂载镜像,挂载镜像至/mnt/目录下#mount /dev/sr0 /mnt/注:lsblk可以查看是/dev/sr0还是/dev/sr1等2、  上传OS镜像至/home路径,挂载镜像至/mnt/目录下(iso文件名视具体情况修改)#mount /home/CentOS-7-aarch64-Everything-1810.iso /mnt/III. 执行以下命令安装所需依赖包# yum install bison ncurses ncurses-devel libaio-devel openssl openssl-devel gmp gmp-devel mpfr mpfr-devel libmpc libmpc-develIV. 升级cmake 至3.4.3或以上版本(本文以3.5.2版本为例)#wget https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz --no-check-certificate#tar -zxvf cmake-3.5.2.tar.gz#cd cmake-3.5.2#./bootstrap#make -j 64#make installV. 升级gcc版本至5.3或者以上(本文以7.3版本为例)系统自带的gcc软件很老,需要重新安装。可以参考《TaiShan服务器性能工具测试及调优指导书》来升级到gcc7.3.0gcc7.3下载地址: https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gzgcc安装路径 /usr/local/gcc-7.3.0/4.1.2 Mysql安装I. 下载源码下载MySQL源码包(includes Boost Headers),并上传至服务器:https://downloads.MySQL.org/MySQL/8.0.19/        上传至服务器/home自定义目录下,       执行tar -zxvf mysql-boost-8.0.19.tar.gz解压后得到mysql-8.0.19目录。II. 编译安装1、进入/home/zy/mysql-8.0.19源码文件夹:# cd /home/zy/mysql-8.0.192、执行命令进行编译安装cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql-8.0.16/mysql     -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1     -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1     -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1     -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DENABLE_DTRACE=0     -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci     -DWITH_EMBEDDED_SERVER=1 -DCMAKE_C_COMPILER=/usr/local/gcc-7.3.0/bin/gcc     -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/zy/mysql-8.0.19/boost/boost_1_70_0     -DFORCE_INSOURCE_BUILD=1 在编译安装的时候,路径要根据实际情况而定,下表为对编译安装的关键路径的解释:DCMAKE_INSTALL_PREFIX用于指定软件的安装路径。本次安装路径为:/usr/local/mysqlDMYSQL_DATADIR创建数据库时,数据文件存放的路径。本次安装路径为:/data/mysql/dataDCMAKE_C_COMPILER安装gcc的存放路径 /usr/local/gcc-7.3.0/bin/gccDWITH_BOOST解压的mysql安装压缩包中boost_1_70_0文件夹所在路径。例如,本文解压在/home目录下,则路径为:/home/zy/mysql-8.0.19/boost/boost_1_70_0# make -j64# make installIII. 修改配置文件编辑my.cnf文件,其中文件路径(包括软件安装路径、数据日志存放路径等)根据实际情况修改。修改/etc/my.cnf文件的组和用户为mysql:mysql。#chown mysql:mysql /etc/my.cnf IV. 配置环境变量编译安装完成后,将mysql二进制文件路径到PATH:echo export PATH=$PATH:/usr/local/mysql/bin >> /etc/profile其中PATH中的/usr/local/mysql/bin路径,为mysql软件安装目录下的bin文件的绝对路径[root@localhost ~]# source /etc/profile 4.1.3 运行I. 初始化数据库执行下面的命令初始化数据库后,回显中第3行中有初始密码,注意保存,7.3章节会用到。# /home/mysql-8.0.16/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize  --basedir=/home/mysql-8.0.16/mysql --datadir=/data/mysql-8.0.16/mysql/data --user=mysqlII. 启动MySQL服务chmod 777 /usr/local/mysql/support-files/mysql.servercp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqlchkconfig mysql onservice mysql startIII. 接入mysql环境。mysql -uroot -p(密码为7.1章节的初始密码,请留意包括特殊字符)IV. 配置数据库账号密码>alter user 'root'@'localhost' identified by "123456";——修改本地root用户登录密码>create user 'root'@'%' identified by '123456';——创建全域root用户(允许root从其他服务器访问)>grant all privileges on *.* to 'root'@'%';——进行授权>flush privileges; V. 退出数据库        执行\q退出数据库5 常见问题处理5.1.1 cmake升级版本不生效的问题问题描述:4.4章节执行后版本不生效。问题原因:可能是原系统自带cmake未卸载造成的解决方法:参考https://blog.csdn.net/jiang_xinxing/article/details/77945478先通过yum移除原先的cmake,然后加软连接 5.1.2 cmake编译安装失败问题描述:6.1章节执行cmake . -DCMAKE_INSTALL_PREFIX=/home/mysql-8.0.16/mysql -DMYSQL_DATADIR=/data/mysql-8.0.16/mysql -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DENABLE_DTRACE=0 -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_EMBEDDED_SERVER=1 -DCMAKE_C_COMPILER=/usr/bin/gcc -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/mysql-8.0.16/boost/boost_1_69_0 -DFORCE_INSOURCE_BUILD=1后报错如下 解决方法:把cmakecache.txt文件删了之后,重新执行5.1.3 按huaweicloud上的方法到启动数据库开始有问题。https://support.huaweicloud.com/instg-kunpengdbs/kunpengmysql8017_03_0013.html即使是编译安装Mysql,也需要修改配置文件、文件目录权限等按指导走到启动数据库,执行Service mysql start 报错尝试find / -name mysql.sock找不到任何文件。cat /etc/my.cnf发现socket配置的是/data/mysql/run/mysql.sock建立个软链接 Ln –s /data/mysql/run/mysql.sock /tmp/mysql.sock但是/data/mysql/run底下没有此sock文件只有链接也没用。    提示/lib64/libstdc++.so.6找不到查看路径下是否有发现链接指向的是6.0.19,这是gcc4.8.5对应的,不正确。应该是gcc7.3.0对应的版本才是对的。查看gcc7.3.0的安装路径下是否有这个so,是6.0.24的版本。重新建立一个软链接,Ln –sf  /usr/local/gcc-7.3.0/lib64/libstdc++.so.6.0.24 /lib64/libstdc++.so.6再启动,这个问题解决。报pid找不到的错误。 安装文件路径要有mysql访问权限,还要手动创建mysql.log和mysql.pid文件,给予mysql用户及用户组权限vi /data/log/mysql.log 【空文件保存退出即可】vi /data/run/mysql.pid 【空文件保存退出即可】chown -R mysql:mysql /data 去查找一下pid文件,看下是否存在。如果存在,权限目录是否mysql用户可以访问。发现是root用户,就赋予mysql用户权限。 登录数据库还是报错。 修改配置文件中的每一项的路径,按实际的来写。Socket的路径写好,并建立软链接。(里面的文件所在的目录均要有mysql用户访问的权限)5.1.4 需要用到mysql connector/c的话,是否需要单独安装connector?mysql如果客户需要用到mysql connector/c的话,不需要单独安装connector,可以看官网的说明和解释。 只要安装了mysql community server就可以,可以实际去查询确认是有libmysqlclient.a和libmysqlclient.so库的。 6 参考资料https://dev.mysql.com/doc/refman/5.7/en/c-api.html
  • [分享交流] 【7天玩转MySQL基础实战营打卡帖】轻松掌握MySQL,完成课程抽取好礼,限时免费招募ing(活动已结束)
    课程开始时请仔细阅读实践准备和打卡须知以免操作失误导致欠费或者无法参与抽奖哦~课程链接:https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXD014+Self-paced/about?ticket=ST-4269323-Dwta5bqpsjjmnlXEJwNDpvj9-sso华为云 · 7天实战营系列活动2020年 -- 7天玩转MySQL基础实战营7天轻松掌握MySQL!完成打卡任务,将有机会获得荣耀手环、体脂秤等多重豪礼哦~限额免费招募,快来报名吧!   活动参与流程  Step1. 请点击链接,先报名活动活动报名链接:https://developer.huaweicloud.com/signup/e52e38aa6ad44f3c8c7f87bb9b0cd597(本次活动涉及代金券发放,请务必填写,数量有限,先到先得)Step2. 添加群助手好友并回复“MySQL”,入群免费报名活动!Step3. 入群后,耐心等待至7月15日开课Step4. 课程视频学习,完成每日打卡任务(打卡任务完成后,请在本帖回复截图)  活动时间  招募期:2020.06.30-2020.07.14培训期:2020.07.15-2020.07.23  课程大纲  讲师简介活动奖励活动规则活动时间:2020年6月30日至 2020年7月23日招募期:2020年6月30日-2020年7月14日课程学习期:2020年7月15日-2020年7月23日1.活动参与方式:    招募期流程:(1)注册华为云中国站账号并登录;(2)点击活动页中的“立即报名”按钮先填写报名表;(3)扫描二维码,添加社群助手微信(hwykfz1),回复“MySQL”,小助手拉您入群。    训练期流程:(1)微信社群助手每日发布当日课程内容及规则,学员完成任务并打卡成功,获得阶段性奖励。     训练期内打卡规则:(1) 打卡时间:每日0:00~23:59;(2) 打卡方式:Step1:请打开当天的“打卡作业”(每一章的第3小节);Step2:按照要求完成作业;Step3:按以下格式在打卡贴内回复完成后的打卡截图:第一行:DayX(X=1到7)+华为云账号+微信昵称(打卡作业截图)[举例]Day1+grandmaster+华为云1号小助手(打卡作业截图)(3) 打卡须知:① 打卡需按照打卡方式要求操作;② 如当天打卡任务有打卡示例,学员所回复打卡截图中必须需显示华为云中国站账号,且为当日操作截图;③ 采用闯关打卡模式,每日只计算一次有效打卡;④ 若当日未进行打卡,训练期内设置3次补打卡机会,超过3次不可再补打卡;⑤ 社群助手将对每日的打卡内容进行审核,审核周期为3~5个工作日,未按照要求上传打卡任务,将被视为无效打卡,不计入打卡天数。2.训练期内评奖方式:(1)完成第1天打卡完成第1天打卡任务,可获得抽奖机会,奖品为海纳斯小风扇或者公牛插线板1个 ;奖品数量上限为80份,中奖概率(≤100%)为“80/完成连续打卡1天任务的总人数”;兑奖时间不可超过训练期第二天,过期无效。(2)连续打卡3天连续完成3天打卡可获得抽奖机会,奖品为华为自拍杆或者手机平板支架1个,奖品数量上限为50份,中奖概率(≤100%)为“50/完成连续打卡3天任务的总人数”;兑奖时间不可超过训练期第四天,过期无效。(3)连续打卡7天连续完成7天打卡可直接获得华为云云享专家直通车机会,奖品为荣耀手环4或者荣耀智能体脂秤1个,奖品数量上限为30份,中奖概率(≤100%)为“30/完成连续打卡7天任务的总人数”;兑奖时间不可超过训练期第八天,过期无效。3.奖品发放说明:每位参加活动的用户理解并同意,为联系获奖用户以及奖品发放的需要,用户须在参与活动之时提供诸如姓名、联系方式、电子邮箱、通讯地址等真实个人信息,活动主办方将仅为前述目的以及适用法律规定的最小限度内收集和使用用户的个人信息,本次活动所收集的个人信息将在活动结束后删除。(用户在向华为云提交个人信息之前,应阅读、了解华为云《隐私政策声明》;用户参加本活动视为理解并同意华为云《隐私政策声明》,华为云《隐私政策声明》网页地址如下:https://www.huaweicloud.com/declaration/sa_prp.html)。获奖用户在领奖界面填写获奖信息,活动结束且用户填写完整领奖信息后14个工作日内,将统一发出奖品,所有实物奖品包邮,不额外收取任何费用。由于获奖用户自身原因(包括但不限于提供的联系方式有误、身份不符或者通知领奖后超过30天未领取等)造成奖品无法发送的,视为获奖用户放弃领奖。为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的用户收回抽奖及奖励资格。本活动规则由华为云在法律规定范围内进行解释。华为云保留不时更新、修改或删除本活动规则的权利。所有参加本活动的用户,均视为认可并同意遵守《华为云用户协议》,包括以援引方式纳入《华为云用户协议》的《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(SLA),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。云服务协议链接的网址:http://www.huaweicloud.com/declaration/sa_cua.html如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
  • [热门活动] 【618•微话题】 MySQL撑起618大促的正确打开方式 !参与赢取大号鼠标垫&双肩包
    电商企业在618期间遇到最棘手的问题便是各种业务流量高峰,比如单日产品访问量便可能上亿,当高于日常流量数倍的业务高峰频现,MySQL有什么灵活应对方式?企业又要如何科学使用MySQL配合应用层支持高峰期大规模访问?——————————————【微话题活动】———————————————今天我们邀请到华为云数据库内核专家 MySQL开源社区innodb首席专家苏斌和大家讨论一下:【MySQL撑起618大促的正确打开方式】活动时间2020年6月18日-2020年6月30日参与方式直接在本帖回复关于以下问题的理解或评论   1. 你觉得MySQL对于电商领域的OLTP场景有哪些优势?      2. 你觉得MySQL在大促时候的高峰期会遇到哪些问题?有哪些改进需求?      3. 你会考虑如何使用好MySQL来配合应用层支持高峰期大规模访问?   4. 你会选择华为云RDS for MySQL来支持自己的电商业务,特别是618之类的大促吗?本期奖品A.回帖参与本次讨论,回复与话题相关的原创内容,即可获得精美鼠标垫1个(数量有限,先到先得)。B.华为云数据库内核专家 MySQL开源社区innodb首席专家苏斌评出3名优质评论奖,各送出华为云定制双肩包1个。(两样奖品不可同时获得,奖品于活动结束发放) 评奖标准回复话题数量和内容质量                                                                                                             优质评论奖3名                                                                                  参与奖近期,618大战如火如荼,各商家不仅是销售额的比拼,更是技术间的较量。开发者关心的是什么?华为云官方揭秘618背后的神秘黑科技:聊聊有哪些厉害的技术,能为618大促保驾护航?能大大提高程序员的幸福感?欢迎点击我们的黑科技攻略专题,也欢迎留下你的想法哦~~https://bbs.huaweicloud.com/contents/618tec.html
  • [技术干货] 万万没想到,我在夜市地摊解决了MySQL临时表空间难题~~
    华为云数据管理服务DAS企业版线上直播首发,美女产品经理带你轻松玩转华为云数据库智能管理与运维,还有618年中大促攻略等你Get,京东卡、机械键盘各种福利拿不停,戳下方二维码立即观看。
  • [问题求助] 萌贝树不是骗子MySQL数据库软安装的时候需要注意什么细节
    萌贝树不是骗子MySQL数据库软安装的时候需要注意什么细节
  • [技术干货] 数据存储新姿势,华为云MySQL混合SSD盘实例正式发布~~
    近日,华为云数据库正式发布了MySQL混合SSD盘实例,它结合了华为云容器、本地SSD盘和高速云盘多重优势,利用华为云容器的热变更能力,以及本地SSD盘的强劲性能和高速云盘的高扩展性,在性能、稳定性,扩展性等方面具有卓越的表现。华为云MySQL混合SSD盘实例好在哪?自动扩容,数据存储高可靠Ø  华为云MySQL混合SSD盘实例,默认将数据写入本地SSD盘,保证磁盘IO高性能写入,确保实例在高吞吐情况下仍可以稳定持续运行。Ø  支持自动扩容,当本地SSD盘存储容量不足,实例急需扩容场景下,华为云MySQL混合SSD盘实例可随时扩容至高速云盘,避免了本地存储空间不足导致数据库节点跨机迁移可能带来的稳定性风险。Ø  支持规格热变更能力,利用华为云容器的live-resize能力,可以做到RDS实例规格变更对业务几乎无影响,保证数据库实例的稳定性。Ø  提供智能调度能力,可根据用户数据的使用热点,把热数据放在性能更快的SSD存储上,保证性能稳定。Ø  支持不同底层SSD存储形态之间的备份恢复,确保数据安全可靠。 超高性能,性价比更高根据华为云用户的测试情况,同规格华为云MySQL混合SSD盘实例性能相比业内通用的本地盘实例性能提升10%以上,整体性价比领先15%以上,不仅具有超高性能和稳定性,而且性价比更高。应用场景华为云MySQL混合SSD盘实例的发布补齐了华为云数据库在低IO时延场景的最后一块拼图,所有对IO时延有高要求的业务,如在线游戏、电商等,华为云MySQL混合SSD盘实例都可以很好的支撑。每一款新特性的发布,均是源于对客户的用心服务,华为云MySQL混合SSD盘实例的好,您用过才知晓,欢迎大家体验。戳它了解更多。【赛事招募】华为云数据库挑战赛火热报名中,诚邀各路数据库英豪前来挑战。丰厚奖金、精美拉新礼品、优质offer推荐、自我展示舞台,各种优质福利拿不停,戳下方二维码,赶紧加入我们吧!(戳它报名) 
  • [技术干货] 【转载】24个经典的MySQL索引问题,你都遇到过哪些?
    转载自:CSDN,原文链接:https://blog.csdn.net/devcloud/article/details/1064374781、什么是索引?索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。2、索引有哪些优缺点?索引的优点(1)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。(2)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。索引的缺点(1)时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;(2)空间方面:索引需要占物理空间。3、索引使用场景(重点)where上图中,根据id查询记录,因为id字段仅建立了主键索引,因此此SQL执行可选的索引只有主键索引,如果有多个,最终会选一个较优的作为检索的依据。-- 增加一个没有建立索引的字段altertable innodb1 add sex char(1);-- 按sex检索时可选的索引为nullEXPLAINSELECT*from innodb1 where sex='男';可以尝试在一个字段未建立索引时,根据该字段查询的效率,然后对该字段建立索引(alter table 表名 add index(字段名)),同样的SQL执行的效率,你会发现查询效率会有明显的提升(数据量越大越明显)。order by当我们使用order by将查询结果按照某个字段排序时,如果该字段没有建立索引,那么执行计划会将查询出的所有数据使用外部排序(将数据从硬盘分批读取到内存使用内部排序,最后合并排序结果),这个操作是很影响性能的,因为需要将查询涉及到的所有数据从磁盘中读到内存(如果单条数据过大或者数据量过多都会降低效率),更无论读到内存之后的排序了。但是如果我们对该字段建立索引alter table 表名 add index(字段名),那么由于索引本身是有序的,因此直接按照索引的顺序和映射关系逐条取出数据即可。而且如果分页的,那么只用取出索引表某个范围内的索引对应的数据,而不用像上述那取出所有数据进行排序再返回某个范围内的数据。(从磁盘取数据是最影响性能的)join对join语句匹配关系(on)涉及的字段建立索引能够提高效率索引覆盖如果要查询的字段都建立过索引,那么引擎会直接在索引表中查询而不会访问原始数据(否则只要有一个字段没有建立索引就会做全表扫描),这叫索引覆盖。因此我们需要尽可能的在select后只写必要的查询字段,以增加索引覆盖的几率。这里值得注意的是不要想着为每个字段建立索引,因为优先使用索引的优势就在于其体积小。4、索引有哪几种类型?主键索引数据列不允许重复,不允许为NULL,一个表只能有一个主键。唯一索引数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。(1)可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引(2)可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2);创建唯一组合索引普通索引基本的索引类型,没有唯一性的限制,允许为NULL值。(1)可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引(2)可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引全文索引是目前搜索引擎使用的一种关键技术。可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引5、索引的数据结构(b树,hash)索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。(1)B树索引mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引。B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树实现的,因为在查看表索引时,mysql一律打印BTREE,所以简称为B树索引)查询方式:主键索引区:PI(关联保存的时数据的地址)按主键查询,普通索引区:si(关联的id的地址,然后再到达上面的地址)。所以按主键查询,速度最快B+tree性质:1)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。2)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。3)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。4)B+ 树中,数据对象的插入和删除仅在叶节点上进行。5)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。(2)哈希索引简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在mysql中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。当然这只是简略模拟图。6、索引的基本原理索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。索引的原理很简单,就是把无序的数据变成有序的查询(1)把创建了索引的列的内容进行排序(2)对排序结果生成倒排表(3)在倒排表内容上拼上数据地址链(4)在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据7、索引算法有哪些?索引算法有 BTree算法和Hash算法BTree算法BTree是最常用的mysql数据库索引算法,也是mysql默认的算法。因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量, 例如:-- 只要它的查询条件是一个不以通配符开头的常量select*fromuserwhere name like'jack%';-- 如果一通配符开头,或者没有使用常量,则不会使用索引,例如: select*fromuserwhere name like'%jack';Hash算法Hash Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。8、索引设计的原则?(1)适合索引的列是出现在where子句中的列,或者连接子句中指定的列(2)基数较小的类,索引效果较差,没有必要在此列建立索引(3)使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间(4)不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。9、创建索引的原则(重中之重)索引虽好,但也不是无限制的使用,最好符合一下几个原则1) 最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。2)较频繁作为查询条件的字段才去创建索引3)更新频繁字段不适合创建索引4)若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。6)定义有外键的数据列一定要建立索引。7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。8)对于定义为text、image和bit的数据类型的列不要建立索引。10、创建索引的三种方式,删除索引第一种方式:在执行CREATE TABLE时创建索引CREATETABLE user_index2 (第二种方式:使用ALTER TABLE命令去增加索引ALTERTABLE table_name ADDINDEX index_name (column_list);ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可自己命名,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。第三种方式:使用CREATE INDEX命令创建CREATEINDEX index_name ON table_name (column_list);CREATE INDEX可对表增加普通索引或UNIQUE索引。(但是,不能创建PRIMARY KEY索引)删除索引根据索引名删除普通索引、唯一索引、全文索引:ALTER TABLE 表名 DROP KEY 索引名 altertable user_index dropKEY NAME;altertable user_index dropKEY id_card;altertable user_index dropKEY information;删除主键索引:alter table 表名 drop primary key(因为主键只有一个)。这里值得注意的是,如果主键自增长,那么不能直接执行此操作(自增长依赖于主键索引):需要取消自增长再行删除:altertable user_index -- 重新定义字段MODIFY id int,dropPRIMARYKEY但通常不会删除主键,因为设计主键一定与业务逻辑无关。11、创建索引时需要注意什么?(1)非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;(2)取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count()函数查看字段的差异值,返回值越大说明字段的唯一值越多字段的离散程度高;(3)索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越多一次IO操作获取的数据越大效率越高。12、使用索引查询一定能提高查询的性能吗?为什么通常,通过索引查询数据比全表扫描要快。但是我们也必须注意到它的代价。(1)索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改。 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O。 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:(2)基于一个范围的检索,一般查询返回结果集小于表中记录数的30%(3)基于非唯一性索引的检索13、百万级别或以上的数据如何删除关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。(1)所以我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分多钟)(2)然后删除其中无用数据(此过程需要不到两分钟)(3)删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右。(4)与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了。14、前缀索引语法:index(field(10)),使用字段值的前10个字符建立索引,默认是使用字段的全部内容建立索引。前提:前缀的标识度高。比如密码就适合建立前缀索引,因为密码几乎各不相同。实操的难度:在于前缀截取的长度。我们可以利用select count(*)/count(distinct left(password,prefixLen));,通过从调整prefixLen的值(从1自增)查看不同前缀长度的一个平均匹配度,接近1时就可以了(表示一个密码的前prefixLen个字符几乎能确定唯一一条记录)15、什么是最左前缀原则?什么是最左匹配原则(1)顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。(2)最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。(3)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式16、B树和B+树的区别(1)在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。(2)B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。17、使用B树的好处B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。18、使用B+树的好处由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。 B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间19、Hash索引和B+树所有有什么区别或者说优劣呢?首先要知道Hash索引和B+树索引的底层实现原理:hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。那么可以看出他们有以下的不同:hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。hash索引不支持使用索引进行排序,原理同上。hash索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为hash函数的不可预测。AAAA和AAAAB的索引没有相关性。hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。hash索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度。而不需要使用hash索引。20、数据库为什么使用B+树而不是B树(1)B树只适合随机检索,而B+树同时支持随机检索和顺序检索;(2)B+树空间利用率更高,可减少I/O次数,磁盘读写代价更低。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗。B+树的内部结点并没有指向关键字具体信息的指针,只是作为索引使用,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素;(3)B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。而在B+树中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。(4)B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。(5)增删文件(节点)时,效率更高。因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。21、B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引。 在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。22、什么是聚簇索引?何时使用聚簇索引与非聚簇索引(1)聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据(2)非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因澄清一个概念:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值何时使用聚簇索引与非聚簇索引23、非聚簇索引一定会回表查询吗?不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。24、联合索引是什么?为什么需要注意联合索引中的顺序?MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。具体原因为:MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用做索引查找,以此类推。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。 
  • [技术干货] MySQL多表join分析
    ## Join并行 ## 1. 多表join介绍 JOIN子句用于根据两个或多个表之间的相关列来组合它们。 例如: Orders: OrderID|CustomerID|OrderDate --|--|-- 10308|2|1996-09-18 10309|37|1996-09-19 10310|77|1996-09-20 Customers: CustomerID|CustomerName|ContactName|Country --|--|--|-- 1|Alfreds Futterkiste|Maria Anders|Germany 2|Ana Trujillo Emparedados y helados|Ana Trujillo|Mexico 3|Antonio Moreno Taquería|Antonio Moreno|Mexico ```SQL SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID; ``` OrderID|CustomerName|OrderDate --|--|-- 10308|Ana Trujillo Emparedados y helados|9/18/1996 10365|Antonio Moreno Taquería|11/27/1996 10383|Around the Horn|12/16/1996 10355|Around the Horn|11/15/1996 10278|Berglunds snabbköp|8/12/1996 ## 2. 多表Join的方式 > Hash join使用新执行器实现,在这里不做讨论 MySQL支持的都是Nested-Loop Join,以及它的变种。 #### 不使用Join buffer **a) Simple Nested-Loop** 对r表的每一行,完整扫描s表,根据r-s组成的行去判断是否满足条件,并返回满足条件的结果给客户端。 ![simple-NLJ.PNG](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202005/29/161032oy2udq8a5t2fpwkf.png) ```SQL mysql> show create table t1; +-------+----------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `id` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+----------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show create table t3; +-------+--------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------+ | t3 | CREATE TABLE `t3` ( `id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+--------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> explain select /*+ NO_BNL() */ * from t1, t3 where t1.id = t3.id; +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL | | 1 | SIMPLE | t3 | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 50.00 | Using where | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ 2 rows in set, 1 warning (0.00 sec) ``` **b) Index Nested-Loop** ![index-NLJ.PNG](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202005/29/161103roslv287u4avuaog.png) 对r表的每一行,先根据连接条件去查询s表索引,然后回表查到匹配的数据,并返回满足条件的结果给客户端。 ```SQL mysql> show create table t2; +-------+---------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------------------------------------------------+ | t2 | CREATE TABLE `t2` ( `id` int(11) NOT NULL, KEY `index1` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+---------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> explain select * from t1, t2 where t1.id = t2.id; +----+-------------+-------+------------+------+---------------+--------+---------+------------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+--------+---------+------------+------+----------+-------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL | | 1 | SIMPLE | t2 | NULL | ref | index1 | index1 | 4 | test.t1.id | 1 | 100.00 | Using index | +----+-------------+-------+------------+------+---------------+--------+---------+------------+------+----------+-------------+ 2 rows in set, 1 warning (0.00 sec) ``` #### 使用Join buffer **a) Block Nested Loop** ![BNL.PNG](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202005/29/161127ahkfgous2xyfdejz.png) 从r表读取一部分数据到join cache中,当r表数据读完或者join cache满后,做join操作。 ```C++ JOIN_CACHE_BNL::join_matching_records(){ do { //读取s表的每一行 qep_tab->table()->file->position(qep_tab->table()->record[0]); //针对s的每一行,遍历join buffer for(each record in join buffer) { get_record(); rc = generate_full_extensions(get_curr_rec()); //如果不符合条件,直接返回 if (rc != NESTED_LOOP_OK) return rc; } } while(!(error = iterator->Read())) } ``` ``` SQL mysql> explain select * from t1, t3 where t1.id = t3.id; +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL | | 1 | SIMPLE | t3 | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 50.00 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+ 2 rows in set, 1 warning (0.00 sec) ``` **b) Batched Key Access** ![BKA.PNG](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202005/29/1611488h1ccqrwhoiuejir.png) 从r表读取一部分数据到join cache中,s表中记录r表被连接的列的值作为索引,查询所有符合条件的索引,然后将这些符合条件的索引排序,然后统一回表查询记录。 其中,对于每一个cached record,都会有一个key,通过这个key去s表扫描所需的数据。 ```C++ dsmrr_fill_buffer(){ while((rowids_buf_cur < rowids_buf_end) && !(res = h2->handler::multi_range_read_next(&range_info))){ //下压的index条件 if (h2->mrr_funcs.skip_index_tuple && h2->mrr_funcs.skip_index_tuple(h2->mrr_iter, curr_range->ptr)) continue; memcpy(rowids_buf_cur, h2->ref, h2->ref_length); } varlen_sort( rowids_buf, rowids_buf_cur, elem_size, [this](const uchar *a, const uchar *b) { return h->cmp_ref(a, b) < 0; }); } dsmrr_next(){ do{ if (rowids_buf_cur == rowids_buf_last) { dsmrr_fill_buffer(); } // first match if (h2->mrr_funcs.skip_record && h2->mrr_funcs.skip_record(h2->mrr_iter, (char *)cur_range_info, rowid)) continue; res = h->ha_rnd_pos(table->record[0], rowid); break; } while(true); } JOIN_CACHE_BKA::join_matching_records(){ while (!(error = file->ha_multi_range_read_next((char **)&rec_ptr))) { get_record_by_pos(rec_ptr); rc = generate_full_extensions(rec_ptr); if (rc != NESTED_LOOP_OK) return rc; } } ``` ```SQL mysql> show create table t1; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `f1` int(11) DEFAULT NULL, `f2` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show create table t2; +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t2 | CREATE TABLE `t2` ( `f1` int(11) NOT NULL, `f2` int(11) NOT NULL, `f3` char(200) DEFAULT NULL, KEY `f1` (`f1`,`f2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> explain SELECT /*+ BKA() */ t2.f1, t2.f2, t2.f3 FROM t1,t2 WHERE t1.f1=t2.f1 AND t2.f2 BETWEEN t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1; +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------------------------------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | Using where | | 1 | SIMPLE | t2 | NULL | ref | f1 | f1 | 4 | test1.t1.f1 | 7 | 11.11 | Using index condition; Using join buffer (Batched Key Access) | +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------------------------------------+ 2 rows in set, 1 warning (0.00 sec) ``` **c) Batched Key Access(unique)** 与Batched Key Access不同的是,r中的列是s的唯一索引,在r记录写入join cache的时候,会记录一个key的hash table,仅针对不同的key去s表中查询。(疑问,为什么只有unique的时候才能用这种方式?不是unique的话,s表中可能会扫描出多条数据,也可以用这种方式去处理,减少s表的重复扫描)。 ```C++ JOIN_CACHE_BKA_UNIQUE::join_matching_records(){ while (!(error = file->ha_multi_range_read_next((char **)&key_chain_ptr))) { do(each record in chain){ get_record_by_pos(rec_ptr); rc = generate_full_extensions(rec_ptr); if (rc != NESTED_LOOP_OK) return rc; } } } ``` ```SQL mysql> show create table city; +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | city | CREATE TABLE `city` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT NULL DEFAULT '', `Country` char(3) NOT NULL DEFAULT '', `Population` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `Population` (`Population`), KEY `Country` (`Country`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show create table country; +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | country | CREATE TABLE `country` ( `Code` char(3) NOT NULL DEFAULT '', `Name` char(52) NOT NULL DEFAULT '', `SurfaceArea` float(10,2) NOT NULL DEFAULT '0.00', `Population` int(11) NOT NULL DEFAULT '0', `Capital` int(11) DEFAULT NULL, PRIMARY KEY (`Code`), UNIQUE KEY `Name` (`Name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec) mysql> EXPLAIN SELECT city.Name, country.Name FROM city,country WHERE city.country=country.Code AND country.Name LIKE 'L%' AND city.Population > 100000; +----+-------------+---------+------------+-------+--------------------+---------+---------+--------------------+------+----------+--------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+-------+--------------------+---------+---------+--------------------+------+----------+--------------------------------------------------------------+ | 1 | SIMPLE | country | NULL | index | PRIMARY,Name | Name | 208 | NULL | 1 | 100.00 | Using where; Using index | | 1 | SIMPLE | city | NULL | ref | Population,Country | Country | 12 | test1.country.Code | 1 | 100.00 | Using where; Using join buffer (Batched Key Access (unique)) | +----+-------------+---------+------------+-------+--------------------+---------+---------+--------------------+------+----------+--------------------------------------------------------------+ 2 rows in set, 1 warning (0.01 sec) ``` ## 3. Join执行流程(老执行器) ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202005/29/161846a6iehr8kkkomgd4n.png) ``` sub_select <--------------------------------------------+ | -> iterator::read() // 读一行数据 | | -> evaluate_join_record() //检查这行数据是否符合条件 | | -> next_select() ---+ | | | sub_select_op <--------+ | | -> op->put_record() // 前表数据写入join cache | | -> put_record_in_cache() | | -> join->record() | | -> join_matching_records() | | -> (qep_tab->next_select)(join, qep_tab + 1, 0) // 继续调用next_select | -> end_send() ```
  • [分享交流] 【求助帖】请问如何在鲲鹏云服务器上搭建Mysql并远程访问
    【求助】请问如何在鲲鹏云服务器上搭建Mysql并远程访问最近研究鲲鹏云服务器:1)鲲鹏云服务器是基于ARM架构的,如何在鲲鹏云服务器上搭建mysql?2)鲲鹏云服务器搭建mysql其性能是否比普通x86服务器性能要好?还请大牛给予支持和帮助
  • [技术干货] 【求助帖】请问如何在鲲鹏云服务器上搭建Mysql并远程访问
    最近研究鲲鹏云服务器:1)鲲鹏云服务器是基于ARM架构的,如何在鲲鹏云服务器上搭建mysql?2)鲲鹏云服务器搭建mysql其性能是否比普通x86服务器性能要好?还请大牛给予支持和帮助
  • 【鲲鹏翱翔】数据库04-MySQL5.7.28移植安装指南-RPM包方式
    1.   简介MySQL是一种快速易用的关系型数据库管理系统(RDBMS),它通过插件形式提供了多种存储引擎,目前最通用的是InnoDB。作为一款开放源码的数据库软件,MySQL社区及用户活跃度很高,用户问题往往可以及时得到响应。此外,MySQL还具有软件体积小、安装简单易于维护等优点。官方链接:https://dev.mysql.com/doc/refman/5.7/en/类别:云计算/数据库2.   部署环境Packet NameVersionCentOSCentOS 7.5 with ARMMysql5.7.283.   安装部署3.1 依赖安装在系统中安装需要的组件,安装相应的库:yum install cmake time libaio-devel ncurses-devel numactl-devel openssl-devel zlib-devel cyrus-sasl-devel openldap-devel  perl-Env  gcc gcc-c++ make rpm-build autoconf perl-JSON3.2 下载安装源码wget https://obs-mirror-ftp4.obs.cn-north-4.myhuaweicloud.com/database/mysql-community-5.7.28-1.el7.src.rpm rpm -ivh   mysql-community-5.7.28-1.el7.src.rpm3.3 编译安装MySQL安装后的源码在/root/rpmbuild/SOURCES/里面。我们将使用系统自带的GCC4.8.5来编译MySQL5.7.28,为此我们需要做一些修改cd /root/rpmbuild/SOURCES vim mysql-5.7.28/sql/mysqld.cc #添加 #include <sys/prctl.h>   vim mysql-5.7.28/cmake/build-configurations/compiler_options.cmake将所有的-O3改成-O1。上述修改不会对MySQL功能造成影响,主要是GCC的版本问题。修改完之后重新打包,编译。tar -zcf mysql-5.7.28.tar.gz mysql-5.7.28 rpmbuild -bb /root/rpmbuild/SPECS/mysql.spec编译完成后,编译好的RPM包在/root/rpmbuild/RPMS/aarch64下      如果不想编译,也可从以下链接获取:https://obs-mirror-ftp4.obs.cn-north-4.myhuaweicloud.com/database/mysql.5.7.28-rpm.tar#安装数据库 rpm -ivh *.rpm启动数据库#启动数据库 systemctl start mysqld #查看数据库状态 systemctl status mysqld数据库初始密码在/var/log/mysqld.log里可以查到mysql -uroot –p #修改密码和远程登录 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Aa!123456'; mysql> use mysql; mysql> update user set host = '%' where user = 'root'; mysql> FLUSH PRIVILEGES;4.   FAQ在执行rpm -ivh *.rpm时,可能会报错    这是因为mariadb-libs和mysql的lib冲突引起的,执行yum -y remove mariadb-libs可解决问题。
  • [问题求助] 在Mysql中如何自定义密码设置的规则?
    **求助:请问在Mysql中如何自定义账户密码的设置规则,如:密码必须包含大小写字母和符号,或必须包含大小写字母和符号中的任意两种**
  • 安装MYSQL5.7.30 再最后出现了错误。求解决办法
    安装的时候出现了异常错误提示如下[100%] Built target pfs_connect_attr-t [100%] Built target mysqld ../../archive_output_directory/libmysqld.a(sql_builtin.cc.o):(.data.rel+0x10): undefined reference to `builtin_csv_plugin' ../../archive_output_directory/libmysqld.a(sql_builtin.cc.o):(.data.rel+0x40): undefined reference to `builtin_archive_plugin' collect2: error: ld returned 1 exit status make[2]: *** [libmysqld/examples/mysql_embedded] Error 1 make[1]: *** [libmysqld/examples/CMakeFiles/mysql_embedded.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... ../../archive_output_directory/libmysqld.a(sql_builtin.cc.o):(.data.rel+0x10): undefined reference to `builtin_csv_plugin' ../../archive_output_directory/libmysqld.a(sql_builtin.cc.o):(.data.rel+0x40): undefined reference to `builtin_archive_plugin' collect2: error: ld returned 1 exit status make[2]: *** [libmysqld/examples/mysql_client_test_embedded] Error 1 make[1]: *** [libmysqld/examples/CMakeFiles/mysql_client_test_embedded.dir/all] Error 2 ../../archive_output_directory/libmysqld.a(sql_builtin.cc.o):(.data.rel+0x10): undefined reference to `builtin_csv_plugin' ../../archive_output_directory/libmysqld.a(sql_builtin.cc.o):(.data.rel+0x40): undefined reference to `builtin_archive_plugin' collect2: error: ld returned 1 exit status make[2]: *** [libmysqld/examples/mysqltest_embedded] Error 1 make[1]: *** [libmysqld/examples/CMakeFiles/mysqltest_embedded.dir/all] Error 2 make: *** [all] Error 2这个没有搜到一个好的解决办法。特来请教
总条数:1406 到第 页
上滑加载中