当前位置: 首页 > article >正文

MySQL中的部分问题(2)

索引失效

运算或函数影响列的使用

  • 当查询条件中对索引列用了函数或运算,索引会失效。

例:假设有索引:index idx_name (name)

select * from users where upper(name) = 'ALICE';  -- 索引失效

因为upper(name)会对列内容进行函数处理,不能直接利用索引。

使用范围条件(如 <, >, BETWEEN)影响索引选择

  • 对索引列使用范围条件后,通常索引的部分数据会被扫描,但如果查询使用了多个条件,索引失效可能会发生。

例:

select * from orders where order_date >= '2025-01-01' and order_date <= '2025-05-01';

在单列索引的情况下会利用索引,但如果在多列索引的第二列有条件,索引失效的可能性增大。

  • 在前字段使用范围查询可以利用索引,但是不能都使用或者后面字段单独使用
  • 当然在联合索引中,即使顺序不同依然可以使用索引。

使用不等于(!=,<>)或OR连接的条件

  • 对于or和某些操作符,索引也可能失效。
select * from products where category_id = 1 or category_id = 2;  -- 索引可能失效

MySQL可能会选择全表扫描。

没有使用比较符(如LIKE没有匹配前缀)

  • like的使用影响索引。如果模式以通配符%开头,索引通常失效。

例:

select * from customers where name like '%John';  -- 索引失效

因为未匹配前缀。

联合索引没有使用最左匹配

例:有索引:(user_id, created_at)

select * from logs where created_at = '2025-06-01';  -- 索引失效

因为没有在user_id条件上,MySQL可能不使用索引。

出现隐式类型转换,如字符型索引使用数字匹配

例:假设有一个表 users,有一个字符类型的索引列 user_id(比如 VARCHAR类型)

create index idx_user_id on users (user_id);

如果用数字去匹配:

select * from users where user_id = 123;

MySQL会将数字123隐式转换成字符 ‘123’,因为列user_id是字符型。

  • 本质
    • 索引失效的原因在于: 索引列的类型与查询条件的值类型不一致,导致MySQL进行类型转换,失去索引的作用。

索引列使用运算

例:

假设有一张表 employees,包括字段 salary,并在这个字段上建立索引:

create table employees (id int primary key,name varchar(50),salary int,index idx_salary (salary)
);

正常查询(索引生效)

select * from employees where salary = 5000;
  • 这里直接比较salary,索引可以被利用,实现快速查找。

使用运算(索引失效)

select * from employees where salary + 1000 = 6000;
  • 这里在 salary 上用了加法运算 索引失效
select * from employees where salary * 2 > 10000;
  • 这里用了乘法,同样导致索引无法被利用。

排查索引失效

  • 使用explain查看查询计划,确认索引是否被用到。
  • 查看type列:
  • ALL 表示全表扫描(索引未使用)
  • index 表示只用索引(全索引扫描)
  • range 表示范围扫描(索引有效)

调整查询条件,优化索引设计。

type说明是否用到索引
ALL全表扫描用到索引,但不利用索引(劣化的情况)
index全索引扫描(只扫描索引结构)用到索引,更快,但还要读取所有索引条目
ref索引查找(基于索引的查找)用到索引,效率较高
range范围扫描(索引范围查找)用到索引
const常数值查找,单行匹配用到索引

不同数据库的特点

关系型数据库(SQL数据库)

MySQL

  • 开源、免费,广泛应用
  • 支持事务、多表连接、ACID特性
  • 适合中小型网站、应用后台
  • 存储引擎多(InnoDB、MyISAM)
  • 生态丰富,社区活跃

PostgreSQL

  • 开源、功能强大
  • 支持复杂查询、完整的事务和ACID
  • 支持扩展(如自定义数据类型、函数)
  • 持续优化性能
  • 更符合标准SQL,支持复杂的关系操作

Oracle

  • 商业数据库,功能强大
  • 支持大规模、高并发、复杂事务
  • 丰富的企业级功能(数据分区、复制、备份等)
  • 高昂的授权费用

Microsoft SQL Server

  • 商业数据库,集成微软生态
  • 易用性强,界面友好
  • 强大的分析和报表功能
  • 适合企业级应用

非关系型数据库(NoSQL)

MongoDB(文档型)

  • 存储BSON格式(类似JSON)
  • 灵活的模式(Schema-free)
  • 易于水平扩展
  • 适用场景:内容管理、实时分析

Redis(键值存储)

  • 内存数据库,高速
  • 支持丰富的数据结构(字符串、哈希、列表、集合)
  • 用于缓存、消息队列、排行榜

Cassandra(宽列存储)

  • 高度可扩展,支持大规模数据
  • 高可用,无单点故障
  • 适合分布式环境、物联网

Couchbase

  • 结合了文档与键值
  • 支持弹性扩展
  • 多模式存储和实时同步

关系型数据库与非关系型数据库的不同

1. 数据模型

  • 关系型数据库(SQL)

    • 使用结构化的表(表格)
    • 数据以行和列形式存储
    • 有固定的模式(schema),预定义字段和数据类型
    • 表之间可以通过外键关联(关系)
  • 非关系型数据库(NoSQL)

    • 不一定用表结构,多样化模型:
      • 文档(MongoDB)
      • 键值(Redis)
      • 列族(Cassandra)
      • 图(Neo4j)
  • 模式灵活(schema-free)

  • 可存储非结构化或半结构化数据

2. 事务和一致性

  • 关系型数据库

    • 支持复杂的事务(如银行转账)
    • 遵循ACID原则(原子性、一致性、隔离性、持久性)
    • 适合对数据一致性要求高的场景
  • 非关系型数据库

    • 多数场景追求高性能和扩展性,可能牺牲部分一致性(遵循BASE原则)
    • 一些支持事务(例如MongoDB的多文档事务),但通常不追求全文事务支持
    • 适合对数据一致性要求不极端的场景

3. 扩展性

  • 关系型数据库

    • 一般垂直扩展(升级硬件)
    • 水平扩展较复杂(需分区分库)
  • 非关系型数据库

    • 天生设计为水平扩展(易于添加节点)
    • 更适合大规模分布式环境

4. 查询语言

  • 关系型数据库

    • 标准SQL查询
    • 强调复杂查询、联结、聚合
  • 非关系型数据库

    • 使用各自的API或专用查询语言
    • 查询可能不如SQL灵活,但对特定场景优化更快

应用场景

类型典型应用场景
关系型数据库(SQL)事务型应用(财务、ERP、CRM)、复杂查询、严格一致性需求
非关系型数据库(NoSQL)实时大数据、内容管理、网络应用、缓存、物联网、大规模分布式存储

总结

特点关系型数据库(SQL)非关系型数据库(NoSQL)
数据模型结构化表格(固定schema)灵活多样(文档、键值、列族、图)
事务支持强(支持ACID)轻量或有限(追求扩展性,可能牺牲一致性)
扩展性垂直扩展较强,水平扩展复杂水平扩展,易于做大规模分布式系统
查询方式SQLAPI/专用查询语言
适用场景需要复杂关系和强一致性系统高扩展性、可变结构、实时性能要求场景

时序数据库

InfluxDB

  • 针对时间序列数据优化(如传感器数据、监控数据)
  • 高效存储和查询时间段数据
  • 支持聚合、连续查询

图数据库

Neo4j

  • 适合存储和分析复杂的关系(社交网络、推荐系统)
  • 图结构存储,关系查询高效
  • 支持Cypher查询语言

主要区别总结

特点关系型(SQL)非关系型(NoSQL)时序数据库图数据库
模式设计固定 schemaSchemaless/灵活时间敏感模型图结构存储
扩展性垂直扩展(纵向升级)水平扩展水平扩展水平扩展
事务支持强(ACID)弱或无(最终一致性)视情况支持支持有限或无事务
查询方式SQLAPI(接口、查询语言)时间范围查询图关系查询(Cypher)
应用场景业务系统、财务、CRM大数据、内容管理等监控、传感器存储关系强、连接复杂的场景

选择MySQL数据库的原因

    1. 开源免费
    • 成本低廉,适合个人、初创公司和中小企业使用,不需要高昂的授权费用。
    1. 使用广泛、社区活跃
    • 拥有庞大的用户基础和丰富的资源,文档、教程、插件多,遇到问题容易获得支持。
    1. 良好的性能表现
    • 在中小型应用和读写压力不极端的场景下,表现优异,响应速度快。
    1. 支持事务和ACID特性
    • 支持完整的事务,确保数据一致性和可靠性,适合金融、用户管理等需要严格数据完整性的场景。
    • ACID是数据库事务的四个基本特性
    1. 易用性强
    • 操作简单、配置灵活,支持多平台,管理工具(如phpMyAdmin)丰富。
    1. 丰富的功能和扩展性
    • 支持存储引擎选择(InnoDB、MyISAM)等,支持视图、存储过程和触发器,满足多样化需求。
    1. 高度兼容性和可扩展性
    • 支持多种开发语言(PHP、Python、Java等)集成,适应各种技术架构。
    1. 适用范围广
    • 适用于网站、电商平台、内容管理系统、后台管理等多个领域。

MySQL的核心优势在于开源免费、性能稳定、支持事务和ACID特性、操作简单、社区资源丰富,适合中小型应用开发和部署。同时,它具有良好的扩展性和兼容性,能够满足多种业务场景的需求。而其他数据库则在特定方面(比如企业级事务、复杂查询、多样的数据模型)具有更明显的优势。

MySQL日志

MySQL的日志系统是数据库管理的重要组成部分,用于记录数据库的运行信息、错误、查询操作等,有助于监控、调试和性能优化。

  • bin log(二进制日志)是InnoDB引擎特有的,只记录该引擎中表的修改记录。binlog是MySQL的Server层实现的,会记录所有引擎对数据库的修改。
  • 开启方式
[mysqld]
log_bin = /path/to/mysql-binlog
  • redo log(物理日志),记录的是在具体某个数据页上做了什么修改; binlog是逻辑日志,记录的是这个语句的原始逻辑。
  • undo log(回滚日志)是循环写的,空间固定会用完; binlog是可以追加写入的, binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
  • error Log(错误日志),记录MySQL启动、关闭,以及运行中出现的错误信息、警告、注意事项,包括启动信息、崩溃信息、权限问题、配置错误等。
    • 配置
[mysqld]
log_error = /path/to/error.log
  • General Query Log(查询日志),记录所有客户端发来的查询请求(包括连接、断开、执行的所有SQL语句)。调试和审计,但会带来性能开销,不建议长期开启。

    • 开启方式
set global general_log = 'ON';
set global log_output = 'FILE'; -- 输出到文件
  • 补充
    • 1、redolog记录修改内容(哪一页发生了什么变化),写于事务开始前,用于数据未落磁盘,但数据库挂了后的数据恢复。
    • 2、binlog记录修改SQL,写于事务提交时,可用于读写分离。
    • 3、undolog记录修改前记录,用于回滚和多版本并发控制。

相关文章:

MySQL中的部分问题(2)

索引失效 运算或函数影响列的使用 当查询条件中对索引列用了函数或运算&#xff0c;索引会失效。 例&#xff1a;假设有索引&#xff1a;index idx_name (name) select * from users where upper(name) ALICE; -- 索引失效因为upper(name)会对列内容进行函数处理&#xf…...

【从前端到后端导入excel文件实现批量导入-笔记模仿芋道源码的《系统管理-用户管理-导入-批量导入》】

批量导入预约数据-笔记 前端场馆列表后端 前端 场馆列表 该列表进入出现的是这样的,这儿是列表操作 <el-table-column label"操作" align"center" width"220px"><template #default"scope"><el-buttonlinktype"…...

LabVIEW音频测试分析

LabVIEW通过读取指定WAV 文件&#xff0c;实现对音频信号的播放、多维度测量分析功能&#xff0c;为音频设备研发、声学研究及质量检测提供专业工具支持。 主要功能 文件读取与播放&#xff1a;支持持续读取示例数据文件夹内的 WAV 文件&#xff0c;可实时播放音频以监听被测信…...

MySQL 8.0 绿色版安装和配置过程

MySQL作为云计算时代&#xff0c;被广泛使用的一款数据库&#xff0c;他的安装方式有很多种&#xff0c;有yum安装、rpm安装、二进制文件安装&#xff0c;当然也有本文提到的绿色版安装&#xff0c;因绿色版与系统无关&#xff0c;且可快速复制生成&#xff0c;具有较强的优势。…...

RoseMirrorHA 双机热备全解析

在数字化时代&#xff0c;企业核心业务系统一旦瘫痪&#xff0c;每分钟可能造成数万甚至数十万的损失。想象一下&#xff0c;如果银行的交易系统突然中断&#xff0c;或者医院的挂号系统无法访问&#xff0c;会引发怎样的连锁反应&#xff1f;为了守护这些关键业务&#xff0c;…...

day 18进行聚类,进而推断出每个簇的实际含义

浙大疏锦行 对聚类的结果根据具体的特征进行解释&#xff0c;进而推断出每个簇的实际含义 两种思路&#xff1a; 你最开始聚类的时候&#xff0c;就选择了你想最后用来确定簇含义的特征&#xff0c; 最开始用全部特征来聚类&#xff0c;把其余特征作为 x&#xff0c;聚类得到…...

pandas 字符串存储技术演进:从 object 到 PyArrow 的十年历程

文章目录 1. 引言2. 阶段1&#xff1a;原始时代&#xff08;pandas 1.0前&#xff09;3. 阶段2&#xff1a;Python-backed StringDtype&#xff08;pandas 1.0 - 1.3&#xff09;4. 阶段3&#xff1a;PyArrow初次尝试&#xff08;pandas 1.3 - 2.1&#xff09;5. 阶段4&#xf…...

LLMs 系列科普文(6)

截止到目前&#xff0c;我们从模型预训练阶段的数据准备讲起&#xff0c;谈到了 Tokenizer、模型的结构、模型的训练&#xff0c;基础模型、预训练阶段、后训练阶段等&#xff0c;这里存在大量的术语或名词&#xff0c;也有一些奇奇怪怪或者说是看起来乱七八糟的内容。这期间跳…...

exp1_code

#include <iostream> using namespace std; // 链栈节点结构 struct StackNode { int data; StackNode* next; StackNode(int val) : data(val), next(nullptr) {} }; // 顺序栈实现 class SeqStack { private: int* data; int top; int capac…...

serv00 ssh登录保活脚本-邮件通知版

适用于自己有服务器情况&#xff0c;ssh定时登录到serv00&#xff0c;并在登录成功后发送邮件通知 msmtp 和 mutt安装 需要安装msmtp 和 mutt这两个邮件客户端并配置&#xff0c;参考如下文章前几步是讲配置这俩客户端的&#xff0c;很简单&#xff0c;不再赘述 用Shell脚本实…...

意识上传伦理前夜:我们是否在创造数字奴隶?

当韩国财阀将“数字永生”标价1亿美元准入权时&#xff0c;联合国预警的“神经种姓制度”正从科幻步入现实。某脑机接口公司用户协议中“上传意识衍生算法归公司所有”的隐藏条款&#xff0c;恰似德里达预言的当代印证&#xff1a;“当意识沦为可交易数据流&#xff0c;主体性便…...

【AIGC】RAGAS评估原理及实践

【AIGC】RAGAS评估原理及实践 &#xff08;1&#xff09;准备评估数据集&#xff08;2&#xff09;开始评估2.1 加载数据集2.2 评估忠实性2.3 评估答案相关性2.4 上下文精度2.5 上下文召回率2.6 计算上下文实体召回率 RAGas&#xff08;RAG Assessment)RAG 评估的缩写&#xff…...

ESP12E/F 参数对比

模式GPIO0GPIO2GPIO15描述正常启动高高低从闪存运行固件闪光模式低高低启用固件刷写 PinNameFunction1RSTReset (Active Low)2ADC (A0)Analog Input (0–1V)3EN (CH_PD)Chip Enable (Pull High for Normal Operation)4GPIO16Wake from Deep Sleep, General Purpose I/O5GPIO14S…...

第二十八章 字符串与数字

第二十八章 字符串与数字 计算机程序完全就是和数据打交道。很多编程问题需要使用字符串和数字这种更小的数据来解决。 参数扩展 第七章,已经接触过参数扩展,但未进行详细说明,大多数参数扩展并不用于命令行,而是出现在脚本文件中。 如果没有什么特殊原因,把参数扩展放…...

[RDK X5] MJPG编解码开发实战:从官方API到OpenWanderary库的C++/Python实现

业余时间一直在基于RDK X5搞一些小研究&#xff0c;需要基于高分辨率图像检测目标。实际落地时&#xff0c;在图像采集上遇到了个大坑。首先&#xff0c;考虑到可行性&#xff0c;我挑选了一个性价比最高的百元内摄像头&#xff0c;已确定可以在X5上使用&#xff0c;接下来就开…...

java复习 05

我的天啊一天又要过去了&#xff0c;没事的还有时间&#xff01;&#xff01;&#xff01; 不要焦虑不要焦虑&#xff0c;事实证明只要我认真地投入进去一切都还是来得及的&#xff0c;代码多实操多复盘&#xff0c;别叽叽喳喳胡思乱想多多思考&#xff0c;有迷茫前害怕后的功…...

aardio 简单网页自动化

WebView自动化&#xff0c;以前每次重复做网页登录、搜索这些操作时都觉得好麻烦&#xff0c;现在终于能让程序替我干活了&#xff0c;赶紧记录下这个超实用的技能&#xff01; 一、初次接触WebView WebView自动化就像给程序装了个"网页浏览器"&#xff0c;第一步得…...

打卡第39天:Dataset 和 Dataloader类

知识点回顾&#xff1a; 1.Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09; 2.Dataloader类 3.minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torch.nn as nn import…...

【评测】Qwen3-Embedding模型初体验

每一篇文章前后都增加返回目录 回到目录 【评测】Qwen3-Embedding模型初体验 模型的介绍页面 本机配置&#xff1a;八代i5-8265U&#xff0c;16G内存&#xff0c;无GPU核显运行&#xff0c;win10操作系统 ollama可以通过下面命令拉取模型&#xff1a; ollama pull modelscope…...

BeanFactory 和 FactoryBean 有何区别与联系?

导语&#xff1a; Spring 是后端面试中的“常青树”&#xff0c;而 BeanFactory 与 FactoryBean 的关系更是高频卡人点。很多候选人混淆两者概念&#xff0c;答非所问&#xff0c;轻则失分&#xff0c;重则直接被“pass”。本文将从面试官视角&#xff0c;深入剖析这一经典问题…...

如何做好一份优秀的技术文档:专业指南与最佳实践

如何做好一份优秀的技术文档&#xff1a;专业指南与最佳实践 技术文档是产品开发、用户支持和团队协作的核心工具。高质量的技术文档能够提升开发效率、降低维护成本并改善用户体验。本文将从实践出发&#xff0c;详细讲解如何编写专业、清晰且实用的技术文档。 &#x1f31f;…...

C语言内存管理和编译优化实战

参考&#xff1a; C语言内存管理“玄学”&#xff1a;从崩溃到精通的避坑指南C语言编译优化实战&#xff1a;从入门到进阶的高效代码优化技巧...

TCP相关问题 第一篇

TCP相关问题1 1.TCP主动断开连接方为什么需要等待2MSL 如上图所示:在被动链接方调用close&#xff0c;发送FIN时进入LAST_ACK状态&#xff0c;但未收到主动连接方的ack确认&#xff0c;需要被动连接方重新发送一个FIN&#xff0c;而为什么是2MSL&#xff0c;一般认为丢失ack在…...

6.Pandas 数据可视化图-1

第三章 数据可视化 文章目录 目录 第三章 数据可视化 文章目录 前言 一、数据可视化 二、使用步骤 1.pyplot 1.1引入库 1.2 设置汉字字体 1.3 数据准备 1.4 设置索引列 ​编辑 1.5 调用绘图函数 2.使用seaborn绘图 2.1 安装导入seaborn 2.2 设置背景风格 2.3 调用绘图方法 2.…...

软件功能测试报告都包含哪些内容?

软件功能测试报告是软件开发生命周期中的重要文档&#xff0c;主要涵盖以下关键内容&#xff1a;    1.测试概况&#xff1a;概述测试目标、范围和方法&#xff0c;确保读者对测试背景有清晰了解。 2.测试环境&#xff1a;详细描述测试所用的硬件、软件环境&#xff0c;确保…...

在Vue或React项目中使用Tailwind CSS实现暗黑模式切换:从系统适配到手动控制

在现代Web开发中&#xff0c;暗黑模式(Dark Mode)已成为提升用户体验的重要功能。本文将带你使用Tailwind CSS在React项目(Vue项目类似)中实现两种暗黑模式控制方式&#xff1a; 系统自动适配 - 根据用户设备偏好自动切换手动切换 - 通过按钮让用户自由选择 一、项目准备 使…...

Linux--命令行参数和环境变量

1.命令行参数 Linux 命令行参数基础 1.1参数格式 位置参数&#xff1a;无符号&#xff0c;按顺序传递&#xff08;如 ls /home/user 中 /home/user 是位置参数&#xff09; 选项参数&#xff1a; 短选项&#xff1a;以 - 开头&#xff0c;单个字母&#xff08;如 -l 表示长格…...

Android 集成 Firebase 指南

Firebase 是 Google 提供的一套移动开发平台&#xff0c;包含分析、认证、数据库、消息推送等多种服务。以下是在 Android 应用中集成 Firebase 的详细步骤&#xff1a; 1. 准备工作 安装 Android Studio - 确保使用最新版本 创建或打开 Android 项目 - 项目需要配置正确的包…...

springboot线上教学平台

摘要&#xff1a;在社会快速发展的影响下&#xff0c;使线上教学平台的管理和运营比过去十年更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上线上教学平台系统是一项十分重要并且有价值的事情。对于传统的线上教学平台控制模型来说&#xff0c;网上线上…...

阿里云 Linux 搭建邮件系统全流程及常见问题解决

阿里云 Linux 搭建 [conkl.com]邮件系统全流程及常见问题解决 目录 阿里云 Linux 搭建 [conkl.com]邮件系统全流程及常见问题解决一、前期准备&#xff08;关键配置需重点检查&#xff09;1.1 服务器与域名准备1.2 系统初始化&#xff08;必做操作&#xff09; 二、核心组件安装…...