GreatSQL 为何选择全表扫描而不选索引

Python爬虫实战:使用最新技术爬取路透社新闻数据 网络爬虫(Web Crawler)是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。随着大数据和人工智能技术的发展,爬虫技术在数据采集、市场分析、舆情监控等领域发挥着越来越重要的作用。requests:同步HTTP请求库aiohttp:异步HTTP请求库:HTML解析库lxml:高效的HTML/XML解析库selenium:浏览器自动化工具playwright:现代浏览器自动化工具pandas:数据处理和分析库scrapy:专业的爬虫框架:生成随机User-Agentredis:缓存和分布式爬虫支持。 阅读详情

GreatSQL 为何选择全表扫描而不选索引

1. 问题背景

在生产环境中,发现某些查询即使有索引,也没有使用索引,反而选择了全表扫描。这种现象的根本原因在于优化器评估索引扫描的成本时,认为使用索引的成本高于全表扫描。

2. 场景复现

2.1 环境信息

  • 机器 IP:192.168.137.120
  • GreatSQL 版本:8.0.32-26

2.2 环境准备

通过脚本创建了一个包含 100 万条数据的表,并在 age 列上创建了索引 idx_age,如下所示:

#!/bin/bash

# 数据库配置
db_host="192.168.137.120"
db_user="root"
db_pass="xxxx"
db_name="test"
db_port=3306
table_name="t1"

my_conn="greatsql -h$db_host -P$db_port -u$db_user -p$db_pass -D$db_name"

# 创建大表
create_table() {
    $my_conn -e "
    CREATE TABLE IF NOT EXISTS ${table_name} (
        id INT primary key,
        name VARCHAR(255),
        age INT,
        email VARCHAR(255),
        address VARCHAR(255),
        created_at DATETIME,
        updated_at DATETIME,
                key idx_age(age)
    );"
}

# 批量插入数据
bulk_insert() {
    values=""
    for ((i=1; i<=1000000; i++)); do
        values+="($i, 'name $i', $((RANDOM % 100)), 'email$i@example.com', 'address $i', NOW(), NOW()),"
        if (( i % 1000 == 0 )); then
            values=${values%,}  # 去掉最后的逗号
            # 执行插入
            $my_conn -e "INSERT INTO ${table_name} (id, name, age, email, address, created_at, updated_at) VALUES $values;"
            values=""  # 重置values
        fi
    done
}

# 主执行函数
main() {
    echo "开始创建表..."
    create_table
    echo "表创建完成!"

    echo "开始批量插入数据..."
    start_time=$(date +%s)
    bulk_insert
    end_time=$(date +%s)

    echo "插入数据完成!"
    echo "耗时:$((end_time - start_time)) 秒"
}

# 执行主函数
main

2.3 SQL 查询

测试了两个查询:

  1. 查询 age > 80 的记录:
greatsql> EXPLAIN SELECT * FROM t1 WHERE age > 80;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | t1    | NULL       | ALL  | idx_age       | NULL | NULL    | NULL | 994098 |    37.05 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
  1. 查询 age < 3 的记录:
greatsql> EXPLAIN SELECT * FROM t1 WHERE age < 3;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows  | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------+
|  1 | SIMPLE      | t1    | NULL       | range | idx_age       | idx_age | 5       | NULL | 55344 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+-------+----------+-----------------------+

对于第一个查询,优化器选择了全表扫描(type = ALL),而对于第二个查询,则使用了索引扫描(type = range)。这是因为优化器认为,在 age > 80 的查询中,索引扫描的成本较高,而全表扫描相对较低。

3. 优化器分析

启用 optimizer_trace 查看优化器的执行细节:

greatsql> SET optimizer_trace="enabled=on";
greatsql> SELECT * FROM t1 WHERE age > 80;
+-----+----------+------+----------------------+-------------+---------------------+---------------------+
| id  | name     | age  | email                | address     | created_at          | updated_at          |
+-----+----------+------+----------------------+-------------+---------------------+---------------------+
|  48 | name 48  |   81 | email48@example.com  | address 48  | 2024-12-26 11:25:00 | 2024-12-26 11:25:00 |
|  87 | name 87  |   81 | email87@example.com  | address 87  | 2024-12-26 11:25:00 | 2024-12-26 11:25:00 |
| 130 | name 130 |   81 | email130@example.com | address 130 | 2024-12-26 11:25:00 | 2024-12-26 11:25:00 |
| 201 | name 201 |   81 | email201@example.com | address 201 | 2024-12-26 11:25:00 | 2024-12-26 11:25:00 |
| 232 | name 232 |   81 | email232@example.com | address 232 | 2024-12-26 11:25:00 | 2024-12-26 11:25:00 |
......
| 999998 | name 999998 |   99 | email999998@example.com | address 999998 | 2024-12-26 11:27:22 | 2024-12-26 11:27:22 |
+--------+-------------+------+-------------------------+----------------+---------------------+---------------------+
greatsql> SELECT trace FROM information_schema.optimizer_trace\G
trace: {
  "steps": [
    {
      "join_preparation": {
        "select#": 1,
        "steps": [
          {
            "expanded_query": "/* select#1 */ select `t1`.`id` AS `id`,`t1`.`name` AS `name`,`t1`.`age` AS `age`,`t1`.`email` AS `email`,`t1`.`address` AS `address`,`t1`.`created_at` AS `created_at`,`t1`.`updated_at` AS `updated_at` from `t1` where (`t1`.`age` > 80)"
          }
        ]
      }
    },
    {
      "join_optimization": {
        "select#": 1,
        "steps": [
          {
            "condition_processing": {
              "condition": "WHERE",
              "original_condition": "(`t1`.`age` > 80)",
              "steps": [
                {
                  "transformation": "equality_propagation", --传播等式
                  "resulting_condition": "(`t1`.`age` > 80)"
                },
                {
                  "transformation": "constant_propagation", --传播常量
                  "resulting_condition": "(`t1`.`age` > 80)"
                },
                {
                  "transformation": "trivial_condition_removal", --移除无关条件
                  "resulting_condition": "(`t1`.`age` > 80)"
                }
              ]
            }
          },
          {
            "substitute_generated_columns": {
            }
          },
          {
            "table_dependencies": [ --表依赖
              {
                "table": "`t1`",
                "row_may_be_null": false,
                "map_bit": 0,
                "depends_on_map_bits": [
                ]
              }
            ]
          },
          {
            "ref_optimizer_key_uses": [
            ]
          },
          {
            "rows_estimation": [ --行数估算
              {
                "table": "`t1`",
                "range_analysis": {
                  "table_scan": { --全表扫描
                    "rows": 994078,  --  994078 行需要被扫描
                    "cost": 106040  -- 106040 是执行全表扫描的估算成本
                  },
                  "potential_range_indexes": [ --潜在范围索引
                    {
                      "index": "PRIMARY",
                      "usable": false,  -- 主键索引不适用于此次查询
                      "cause": "not_applicable"  
                    },
                    {
                      "index": "idx_age",
                      "usable": true,  -- idx_age索引可用于此次查询
                      "key_parts": [  -- 索引基于age,id创建
                        "age",
                        "id"
                      ]
                    }
                  ],
                  "setup_range_conditions": [
                  ],
                  "group_index_range": {
                    "chosen": false,
                    "cause": "not_group_by_or_distinct"
                  },
                  "skip_scan_range": {
                    "potential_skip_scan_indexes": [
                      {
                        "index": "idx_age",
                        "usable": false,
                        "cause": "query_references_nonkey_column"
                      }
                    ]
                  },
                  "analyzing_range_alternatives": {
                    "range_scan_alternatives": [
                      {
                        "index": "idx_age",
                        "ranges": [
                          "80 < age"
                        ],
                        "index_dives_for_eq_ranges": true,
                        "rowid_ordered": false,
                        "using_mrr": false,
                        "index_only": false,
                        "in_memory": 0,
                        "rows": 379410,  -- 使用idx_age索引估算扫描行数
                        "cost": 417303,  -- 使用idx_age索引估算成本
                        "chosen": false,  -- 未选择该索引
                        "cause": "cost"
                      }
                    ],
                    "analyzing_roworder_intersect": {
                      "usable": false,
                      "cause": "too_few_roworder_scans"
                    }
                  }
                }
              }
            ]
          },
          {
            "considered_execution_plans": [ --考虑的执行计划
              {
                "plan_prefix": [
                ],
                "table": "`t1`",
                "best_access_path": {  -- 最优访问方式
                  "considered_access_paths": [
                    {
                      "rows_to_scan": 994078,
                      "access_type": "scan",  
                      "resulting_rows": 994078,
                      "cost": 106038,
                      "chosen": true  
                    }
                  ]
                },
                "condition_filtering_pct": 100,
                "rows_for_plan": 994078,  
                "cost_for_plan": 106038,  
                "chosen": true  -- 优化器最终选择了全表扫描,行数为994708,成为106038
              }
            ]
          },
          {
            "attaching_conditions_to_tables": { --将条件附加到表
              "original_condition": "(`t1`.`age` > 80)",
              "attached_conditions_computation": [
              ],
              "attached_conditions_summary": [
                {
                  "table": "`t1`",
                  "attached": "(`t1`.`age` > 80)"
                }
              ]
            }
          },
          {
            "finalizing_table_conditions": [ --最终确定表条件
              {
                "table": "`t1`",
                "original_table_condition": "(`t1`.`age` > 80)",
                "final_table_condition   ": "(`t1`.`age` > 80)" --最终的表条件
              }
            ]
          },
          {
            "refine_plan": [ --优化计划细节
              {
                "table": "`t1`"
              }
            ]
          }
        ]
      }
    },
    {
      "join_execution": {
        "select#": 1,
        "steps": [
        ]
      }
    }
  ]
}

从优化器的执行计划中可以看到:

  • 全表扫描:优化器选择了全表扫描的估算成本为 106038。
  • 索引扫描:虽然索引 idx_age 在 age 列上可以被使用,但由于它并不包含查询中所有列(如 id, name, email 等),因此需要回表操作,导致索引扫描的估算成本为 417303,远高于全表扫描。

4. 问题分析

优化器选择使用全表扫描而不是索引扫描的原因主要是因为:

  • 回表开销:idx_age 索引仅包含 age 和 id 列,而查询需要 age, id, name, email, address, created_at, updated_at 等字段。因此,使用索引后需要额外的回表操作,这会增加查询的成本。特别是在数据量较大时,回表次数增多,导致整体性能下降。
  • 估算成本:在某些情况下,优化器评估使用索引的成本比全表扫描高。例如,如果查询涉及的列较多,而索引并不覆盖这些列,回表的代价可能超过直接扫描整张表的代价。优化器会倾向于选择代价较低的执行计划,即全表扫描。

5. 解决方案与优化建议

  • 查询优化:可以通过调整查询条件,减少涉及的列数,或者使用 EXPLAIN 分析不同查询条件的执行计划,选择最优的查询方式。
  • 分析索引选择性:确保索引列的选择性较高,即索引能有效减少扫描的行数。如果某个列的选择性较低(如范围条件 age > 80),全表扫描可能仍然是最优选择。
  • 调整配置参数:根据表的数据分布和查询特征,可能需要调整 MySQL 的优化器相关参数(如 optimizer_search_depth 或 optimizer_switch),以优化查询执行计划的选择。
  • 在本案例中,条件 age > 80 读取扫描的数据量太大了,在真实业务中只有很少数情况需要读取这么大量数据,因此建议加上 LIMIT N 限定读取行数(N通常不高于1000)。
  • 在部分其他场景中,有时可以尝试通过使用直方图来优化查询效率,可以根据实际情况选择。关于直方图可以参考文章:深入聊聊MySQL直方图的应用。

通过这些方法,可以有效减少全表扫描的发生,提高查询性能。

IMSL CNL 7.0.0 (x86-64)Crack IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件 立即下载

相关推荐

华硕三频万兆分布式路由组网实战:从AiMesh 2.0到全屋Wi-Fi 6覆盖

Mesh组网是解决大户型Wi-Fi覆盖难题的主流方案,其核心原理是通过多个节点构建网状网络,实现设备间的无缝漫游。在技术层面,Wi-Fi 6标准、三频设计(包括专属回程频段)和有线回程等技术,共同提升了网络的带宽、稳定性和抗干扰能力。这些技术的工程价值在于,能够为多设备并发、高带宽应用(如4K/8K流媒体、在线游戏、内网文件高速传输)提供可靠支撑。具体到应用场景,例如利用华硕AiMesh 2.0系统,配合三频万兆分布式路由器,可以实现智能的设备连接与负载均衡。通过合理规划节点位置、优先采用有线回程,并进行Q

weixin_34054866的博客 431

【GreatSQL优化器-02】索引和Sargable谓词

GreatSQL的优化器在有过滤条件的时候,需要先把条件按照是否有索引来进行区分,可以用索引来加速查询的条件称为Sargable,其中arge来源于(搜索参数)的首字母拼成的"SARG"。GreatSQL用索引数组和Sargables数组来储存Sargable谓词,其中Sargable数组是对的补充使用,比如``a<b``条件如果 a 列上建立有索引并且b不是常量,a存入数组,而这个b就存入Sargable数组。因此 Sargable 也可以叫做可索引谓词。Sargable谓词在优化器执行的一开始就通过。

GreatSQL2021的博客 775

手把手教程:使用C#实现工业上位机开发

深入讲解如何利用C#进行上位机开发,涵盖通信协议与界面设计,助力掌握工业自动化核心技能。结合实际案例,让上位机开发更高效直观。

weixin_32480007的博客 2065

GreatSQL分页查询优化案例实战

GreatSQL 分页优化实战:解析 Oracle 迁移后的分页写法差异,揭秘大表高效查询技巧,助你规避性能陷阱,提升数据库效能!

GreatSQL2021的博客 644

众灵科技24路舵机控制器二次开发实战(1)-STM32串口指令控制详解

本文详细介绍了如何通过STM32单片机对众灵科技24路舵机控制器进行二次开发,实现串口指令控制。文章从硬件连接、通信协议解析到STM32代码实战,手把手指导开发者打通控制链路,并重点讲解了如何调用预设动作组驱动六足机器人,为后续集成传感器、无线遥控等高级功能奠定基础。

weixin_29188997的博客 484

TIA博途V15.1实战:用PLCSIM Advanced V2.0模拟Modbus TCP/IP通信(附完整DB块配置)

本文详细介绍了如何在TIA博途V15.1环境中,利用PLCSIM Advanced V2.0软件仿真S7-1500 PLC的Modbus TCP/IP通信功能。通过实战步骤,重点解析了MB_SERVER指令调用、连接参数(CONNECT)配置以及核心数据块(DB)的映射方法,并附上了完整的DB块配置示例,帮助工程师在无物理硬件条件下高效完成通信逻辑的验证与调试。

m2n3o4p5的博客 408

【GreatSQL优化器-17】DYNAMIC RANGE

GreatSQL 的优化器有一种扫描方式是动态范围扫描方式,类似于“已读乱回”模式,这种模式是在表有多个索引的情况下,对驱动表连接的时候部分选择索引的情况。优化器没有找到好的索引可以使用,但发现在知道前面表的列值后,可能会使用某些索引。对于前面表中的每个行组合,优化器检查是否可以使用 range 或 index merge 访问方法来检索行。虽然这不是很快,但比执行完全没有索引的连接要快。下面用一个简单的例子来说明直方图怎么应用在优化器。

GreatSQL2021的博客 635

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

本文详细解析了企业微信群机器人的Webhook配置全流程,从创建机器人、获取关键Webhook地址,到使用代码发送文本、Markdown等多种消息类型。内容涵盖安全加固、错误处理及与CI/CD等系统集成的实战指南,帮助企业快速构建高效、稳定的内部通知系统。

ik678901的博客 1783

GreatSQL 中为什么 Update 不会被锁等待

session2 执行 update 后,innodb 会进行半一致读,获取每一行的最新提交版本,然后通过 where 条件过滤,判断该行是否能被锁定,如下图,对于 id=1,id=2 的记录符合 where 条件,可以获取到行锁,对于 id=3 的记录并不符合 where 条件记录,所以 session2 对 id=3 的行不加锁,也就说和 session1 持有的 id=3 的行锁并不冲突。继续后续扫描,对于 id=4 的记录符合 where 条件,可以获取到行锁。直到完成所有的扫描和加锁。

GreatSQL2021的博客 1097

编译原理(东南大学)一:【编译原理期末冲刺救命笔记】速存!看完再上考场稳了!

本文详细介绍了编译原理的核心概念和流程,包括程序设计语言的分类、编译程序的各个阶段(如词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成)以及编译程序生成和构造的基础知识。文章还探讨了编译中的表格管理、出错处理和遍的概念,以及编译基础知识如高级语言、语法规则、字母表和符号串的运算。此外,文中还涉及文法与语言的关系,包括文法的概念、非终结符、终结符、产生式、推导和规约等。整体内容旨在为学习编译原理的学生提供全面的复习资料和考试准备指南。

一位搞嵌入式和前端的genius的博客 1028

Unreal5 从入门到精通之 学习Niagara特效系统

UE5 Niagara粒子系统解析 Niagara是UE5中的高性能粒子特效系统,相比传统粒子系统具有完全可编程性和可视化节点编辑两大特点。核心单元发射器(Emitter)分为模板发射器(预设效果如喷泉、火焰)和空白发射器(高度自定义)。系统提供13种预设模板,包括吹飞粒子、五彩纸屑爆发、动态光束等常见特效。 Niagara采用三级模块化设计: 系统级:全局参数设置与更新 发射器级:控制粒子生成规则与行为 粒子级:处理单个粒子的生命周期和渲染 关键模块包括初始化粒子属性、物理模拟、颜色渐变等,支持GPU加速

TxNet 1124

GreatSQL优化技巧:使用 FUNCTION 代替标量子查询

本文介绍 GreatSQL 优化技巧,用 FUNCTION 代替标量子查询。原 SQL 耗时 86s,改写后 9.5s,性能提升 9 倍,快来学习!

GreatSQL2021的博客 763

如何通过Davinci Configurator来新增一个BswM仲裁规则

详细介绍如何通过Davinci Configurator来新增一个BswM仲裁规则。

initiallizer的博客 771

【GreatSQL优化器-03】查询开销估算

GreatSQL的优化器在创建执行计划的时候是根据每张表的行数和数据分布以及读数据硬盘消耗等信息来判断先查询哪张表后查询哪张表,要不要使用索引,这些表资源信息就被称为cost,俗称为"开销"。在这之前已经执行了(参考【GreatSQL优化器-02】)和(参考【GreatSQL优化器-01】),拿到了信息和表的索引信息,这里就开始计算单张表扫描的开销,做一个初步的估计,用来给后面的搜索最佳表顺序提供原始数据信息。优化器通过函数初步计算单表开销,这个函数最后会计算出3个重要的数据。名称说明计算公式。

GreatSQL2021的博客 1098

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【GreatSQL优化器-18】GROUP_INDEX_SKIP_SCAN

优化器系列第十八篇,全网独家解析代码+例子,深入透彻地理解每一个细节。在本篇中,将聚焦于“GROUP_INDEX_SKIP_SCAN”。

GreatSQL2021的博客 521

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【GreatSQL优化器-15】index merge

优化器系列第十五篇,全网独家解析代码+例子,深入透彻地理解每一个细节。在本篇中,将聚焦于“index merge”。

GreatSQL2021的博客 1090

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【GreatSQL优化器-10】find_best_ref

GreatSQL的优化器对于join的表需要根据行数和cost来确定最后哪张表先执行哪张表后执行,这里面就涉及到预估满足条件的表数据,在keyuse_array数组有值的情况下,会用find_best_ref函数来通过索引进行cost和rows的估计,并且会找出最优的索引。这样就可能不会继续用后面的calculate_scan_cost()进行全表扫描计算cost,可以节省查询时间。这个功能是对之前【优化器05-条件过滤】的补充功能,二者有可能一起用,也有可能只选择一种计算,要看具体条件。

GreatSQL2021的博客 795

CentOS7安装GreatSQL

GreatSQL 数据库是一款 开源免费 数据库,可在普通硬件上满足金融级应用场景,具有 高可用、高性能、高兼容、高安全 等特性,可作为 MySQL 或 Percona Server for MySQL 的理想可选替换。

落的博客 1701

【GreatSQL优化器-16】INDEX_SKIP_SCAN

优化器系列第十六篇,全网独家解析代码+例子,深入透彻地理解每一个细节。在本篇中,将聚焦于“INDEX_SKIP_SCAN”。

GreatSQL2021的博客 637

面向金融级应用的GreatSQL正式开源

本文首发于 GreatSQL社区 微信公众号。经过几个月的紧张筹备,GreatSQL宣布正式开源。GreatSQL是源于Percona Server的分支版本,除了Percona Serv...

老叶茶馆 510

GreatSQL执行计划基线:SQL Digest让性能漂移无处遁形

数据库运行久了,你是否遇到过这样的场景:昨天还秒开的查询,今天突然变慢十倍?SQL 没改、数据量没暴涨,问题却出在执行计划悄然"漂移"。GreatSQL 作为一款开源免费的国产数据库,内置了执行计划基线(Plan Baseline)能力,借助 SQL Digest 精准识别每条 SQL,让性能漂移无处遁形。本文将带你快速上手 GreatSQL 执行计划基线,学会用 5 分钟定位执行计划漂移的元凶。

gitblog_00107的博客 203

【GreatSQL优化器-05】条件过滤condition_fanout_filter

GreatSQL 的优化器对于 join 的表需要根据行数和 cost 来确定最后哪张表先执行哪张表后执行,这里面就涉及到预估满足条件的表数据,会根据一系列方法计算出一个数据过滤百分比,这个比百分比就是 filtered 系数,这个值区间在[0,1],值越小代表过滤效果越好。用这个系数乘以总的行数就可以得出最后需要扫描的表行数的数量,可以大幅节省开销和执行时间。这个功能是由OPTIMIZER_SWITCH_COND_FANOUT_FILTER这个OPTIMIZER_SWITCH来控制的,默认是打开的。

GreatSQL2021的博客 1083

GreatSQL 优化技巧:最值子查询与窗口函数相互转换

GreatSQL 优化技巧:最值子查询与窗口函数互转案例解析,揭秘高效降 I/O 之道,助你提升 SQL 性能百倍,速看进阶!

GreatSQL2021的博客 1001

面向金融数据库 GreatSQL 正式开源

GreatSQL 社区近日宣布,在经过几个月的紧张筹备后,GreatSQL 现已正式开源。GreatSQL 可以作为MySQL或Percona Server的可选替代方案,用于线上生产环境;完全免费并兼容MySQL或Percona Server。 根据介绍,GreatSQL 是源于 Percona Server的分支版本,除了Percona Server已有的稳定可靠、高效、管理更方便等优势外,特别是进一步提升了MGR(MySQL Group Replication)的性能及可靠性,以及众多bug修复。 此

m0_59537084的博客 680

GreatSQL非阻塞式DDL与异步删除大表:运维不再胆战心惊

**GreatSQL非阻塞式DDL**和**异步删除大表**是GreatSQL数据库(开源免费的金融级数据库,可作为MySQL的理想替换)为运维场景打造的两大利器。过去,执行一条`ALTER TABLE`或`DROP TABLE`往往让人手心冒汗——业务卡顿、主从延迟、性能断崖式下跌,稍有差池就是一场事故。如今,GreatSQL让DDL不再"堵车"、大表删除不再"惊心",彻底告别胆战心惊的运维日常

gitblog_01134的博客 136

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 130
上一篇: 【GreatSQL优化器-17】DYNAMIC RANGE
下一篇: 【GreatSQL优化器-18】GROUP_INDEX_SKIP_SCAN
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值