<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mysql on 张同的博客</title><link>https://www.zhangblogs.cn/categories/mysql/</link><description>Recent content in Mysql on 张同的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 30 Dec 2025 22:14:00 +0800</lastBuildDate><atom:link href="https://www.zhangblogs.cn/categories/mysql/index.xml" rel="self" type="application/rss+xml"/><item><title>MYSQL查询优化</title><link>https://www.zhangblogs.cn/archives/mysqlcha-xun-you-hua/</link><pubDate>Tue, 30 Dec 2025 22:14:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/mysqlcha-xun-you-hua/</guid><description>&lt;h2 id="mysql优化常用策略"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;MYSQL优化常用策略&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id="1-优化数据访问"&gt;&lt;span fontsize="" color=""&gt;&lt;strong&gt;1. 优化数据访问&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;这种策略的思想是尽量减少数据访问。涵盖两方面：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;一是应用程序减少对数据库数据的访问，包括访问频次和访问范围，对于数据时效性高的场景应当用中间件解决，而不是频繁访问数据库。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;二是访问数据要减少实际扫描的记录数。&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;比如我们常会写下面这样的语句&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;select * from tb_orders where user_id = 123 order by create_time desc limit 20;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;我们选择使用投影&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;select id,user_id,status,create_time
from tb_orders
where user_id = 123
order by create_time desc
limit 20;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;这样用不到的列是不会被扫描的，尤其是对于宽表来说，性能将提高不少。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;尽早过滤是另外一种减少数据扫描的方法。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;这同样又包含两种办法，一是过滤条件要早生效，这样后续的&lt;/span&gt;&lt;code&gt;jion/sort/agg&lt;/code&gt;&lt;span fontsize="" color=""&gt;就会越轻松。二是&lt;/span&gt;&lt;code&gt;where&lt;/code&gt;&lt;span fontsize="" color=""&gt;使用&lt;/span&gt;&lt;code&gt;等值/范围&lt;/code&gt;&lt;span fontsize="" color=""&gt;,而&lt;strong&gt;不要使用表达式包裹&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 反例如下
where DATE(create_time) &amp;gt; '2025-12-29'
​
# 推荐
where create_time &amp;gt;= '2025-12-29 00:00:00'
and   create_time &amp;lt;  '2025-12-30 00:00:00'
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;控制返回行数&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;LIMIT子句有一个深分页问题，这往往也是性能结症所在。&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;select id,create_time
from orders
where user_id = 123
order by create_time desc
limit 100000,20;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;上面的语句就是典型的深分页，&lt;/span&gt;&lt;code&gt;limit offset,size&lt;/code&gt;&lt;span fontsize="" color=""&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;深分页慢的核心原因是MYSQL通常会按照&lt;/span&gt;&lt;code&gt;ORDER BY&lt;/code&gt;&lt;span fontsize="" color=""&gt;找到前&lt;/span&gt;&lt;code&gt;offset + size&lt;/code&gt;&lt;span fontsize="" color=""&gt;条记录，然后再丢弃前&lt;/span&gt;&lt;code&gt;offset&lt;/code&gt;&lt;span fontsize="" color=""&gt;记录，只返回最后的&lt;/span&gt;&lt;code&gt;size&lt;/code&gt;&lt;span fontsize="" color=""&gt;条记录。以上例而言，要找到 &lt;/span&gt;&lt;code&gt;100001 ~ 100020&lt;/code&gt;&lt;span fontsize="" color=""&gt;条记录，数据库往往会先处理100020条记录。offset越大，&lt;/span&gt;&lt;code&gt;scan/sort/agg&lt;/code&gt;&lt;span fontsize="" color=""&gt;的工作量越接近线性增长。即使有索引的清空下，仍要走大量的&lt;/span&gt;&lt;code&gt;读索引+回表读取完整行&lt;/code&gt;&lt;span fontsize="" color=""&gt;的步骤，IO和CPU都会网上走。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;更好的替代方案是使用上一页组后一条记录的排序健作为游标条件，而不是&lt;/span&gt;&lt;code&gt;offset&lt;/code&gt;&lt;span fontsize="" color=""&gt;。这样MYSQL可以通过索引定位到游标位置，再向后取20条，直接跳过前面的100000行扫描。&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;select id,create_time
from orders
where user_id = 123
and (create_time,id) &amp;lt; ('2025-12-29 10:00:00',987654)
order by create_time desc,id desc
limit 20;
​
# 对应推荐索引
create index idx_tb_orders_user_time_id on tb_orders(user_id,create_time,id);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在&lt;/span&gt;&lt;code&gt;EXPLAIN&lt;/code&gt;&lt;span fontsize="" color=""&gt;中，&lt;/span&gt;&lt;code&gt;type&lt;/code&gt;&lt;span fontsize="" color=""&gt;尽量从ALL变成r&lt;/span&gt;&lt;code&gt;ange/ref/eq_ref/const&lt;/code&gt;&lt;span fontsize="" color=""&gt;,rows明显过大的要注意，&lt;/span&gt;&lt;code&gt;Extra&lt;/code&gt;&lt;span fontsize="" color=""&gt;中出现&lt;/span&gt;&lt;code&gt;Using temporary&lt;/code&gt;&lt;span fontsize="" color=""&gt;也要注意,&lt;/span&gt;&lt;code&gt;key/key_len&lt;/code&gt;&lt;span fontsize="" color=""&gt;是否和预期一样索引命中。&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Rocky Linux 8 安装 MySQL 5.7（仓库安装）SOP</title><link>https://www.zhangblogs.cn/archives/rocky-linux-8-an-zhuang-mysql-5.7-cang-ku-an-zhuang-sop/</link><pubDate>Mon, 08 Sep 2025 20:24:00 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/rocky-linux-8-an-zhuang-mysql-5.7-cang-ku-an-zhuang-sop/</guid><description>&lt;h1 id="rocky-linux-8-安装-mysql-57仓库安装sop"&gt;&lt;strong&gt;Rocky Linux 8 安装 MySQL 5.7（仓库安装）SOP&lt;/strong&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;说明：MySQL 5.7 已 EOL，仅在确有兼容需求时短期使用。官方 EL8 仓库已不再提供 5.7，我们采用&lt;strong&gt;创建 repo，指向官方 EL7 的 5.7 仓库&lt;/strong&gt;的方式在 Rocky 8 安装（依旧属于“仓库安装”）。 本 SOP 默认你以 &lt;code&gt;root&lt;/code&gt; 或 &lt;code&gt;sudo&lt;/code&gt; 执行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="0-环境确认与准备"&gt;&lt;strong&gt;0. 环境确认与准备&lt;/strong&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看系统版本（确保是 Rocky Linux 8）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /etc/os-release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uname -r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;​
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 基础更新与工具（含 repo 管理插件）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf -y update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf -y install dnf-plugins-core
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;​
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Rocky8 某些依赖在 CRB/PowerTools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf config-manager --set-enabled crb &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf config-manager --set-enabled powertools &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;​
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如系统中已安装 MariaDB/MySQL，请先备份数据！&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="1-关闭系统自带-mysql-模块避免遮蔽"&gt;&lt;strong&gt;1. 关闭系统自带 mysql 模块（避免遮蔽）&lt;/strong&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf -y module reset mysql
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf -y module disable mysql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2-创建-mysql-57-仓库文件指向官方-el7-仓库"&gt;&lt;strong&gt;2. 创建 MySQL 5.7 仓库文件（指向官方 EL7 仓库）&lt;/strong&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tee /etc/yum.repos.d/mysql57-community.repo &amp;gt;/dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[mysql57-community]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;name=MySQL 5.7 Community Server (EL7 packages)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;baseurl=https://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;enabled=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gpgcheck=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# 同时声明多把官方公钥，避免“钥匙不匹配”
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# 避免被模块化遮蔽
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;module_hotfixes=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;​
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 导入官方 GPG Key（含旧钥匙与 2022/2023 新钥匙）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;​
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 刷新缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf clean all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf /var/cache/dnf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf -y makecache
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-预装依赖解决-so5-兼容网络工具等"&gt;&lt;strong&gt;3. 预装依赖（解决 .so.5 兼容、网络工具等）&lt;/strong&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Rocky8 提供 ncurses-compat-libs（提供 libncurses.so.5 / libtinfo.so.5）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf -y install ncurses-compat-libs net-tools libaio numactl-libs perl perl-Data-Dumper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;若提示找不到 &lt;code&gt;ncurses-compat-libs&lt;/code&gt;，请先确认 &lt;code&gt;crb/powertools&lt;/code&gt; 已启用；仍无则 &lt;code&gt;dnf provides '*/libtinfo.so.5'&lt;/code&gt; 查看何者提供。&lt;/p&gt;</description></item></channel></rss>