MySQL新手必看:40道基础概念选择题解析与实战应用

40道进阶的Python练习题 大家好,我是程序媛学姐,今天为大家梳理了40道进阶的Python练习题,方便大家学习参考。 本文目录1. 编写一个Python程序实现自定义装饰器,用于记录函数执行时间2. 创建一个Python上下文管理器,用于测量一段代码的执行时间3. 使用Python实现二分查找算法用于已排序列表4. 编写一个Python程序解析JSON字符串并使用递归提取特定信息5. 开发一个Python脚本,使用`requests`库自动下载给定URL的文件6. 实现一个自定义异常类,并在try-except块中处理它7. 编写 阅读详情

MySQL基础概念深度解析:从选择题到实战应用的思维跃迁

很多刚接触MySQL的朋友,可能都做过类似“40道基础概念选择题”这样的练习。做完之后,对了几道,错了几道,答案一看,似乎懂了,又似乎没完全懂。这种感受我特别理解,因为我也曾是其中一员。选择题的价值,绝不仅仅在于选出那个正确的字母,而在于题目背后所指向的、构成数据库世界基石的那些核心概念。这些概念,是理解MySQL如何工作、如何高效使用它的钥匙。今天,我们不满足于仅仅知道“选C”,而是要一起推开这扇门,看看门后那些关于数据组织、查询优化、架构设计的精彩世界,并探讨它们如何真实地作用于我们日常的开发与运维工作。无论你是正在入门的数据新人,还是希望夯实基础的中级开发者,这篇文章都将带你进行一次系统性的概念重塑与实战连接。

1. 数据库系统的核心骨架:DB、DBMS与DBS

当我们谈论MySQL时,首先得弄清楚我们到底在谈论它的哪个层面。是那一堆存储在硬盘上的数据文件?是那个能让我们用SELECT * FROM users与之对话的软件?还是一个包含了数据、软件、管理员和硬件的完整生态系统?这恰恰对应了三个最基础也最易混淆的概念:DB(数据库)、DBMS(数据库管理系统)和DBS(数据库系统)。

DB,即数据库,本质上是数据的集合。但这个集合不是杂乱无章的,它是“按照一定的数据模型组织的、长期存储在计算机内、可为多个用户共享的”。想象一下一个图书馆,DB就是图书馆里所有的书籍本身。而MySQL的SHOW DATABASES;命令,就像是查看图书馆里有几个不同的藏书区(比如文学区、科技区)。

DBMS,数据库管理系统,就是管理这个“图书馆”的软件系统。它的核心职责包括数据定义、数据操纵、数据查询和数据控制。MySQL、Oracle、PostgreSQL这些都是具体的DBMS。它位于用户(或应用程序)和操作系统之间,将用户对数据的高级语言操作(如SQL)翻译成底层的文件操作。一个常见的误解是认为DBMS包含了DB,实际上,DBMS是操作和管理DB的工具。

那么DBS呢?它是一个更宏观的概念,指引入了数据库技术后的整个计算机系统。它包含了:

  • 数据库(DB):存储的数据。
  • 数据库管理系统(DBMS):管理软件。
  • 应用程序:使用数据库的软件。
  • 数据库管理员(DBA):管理和维护系统的人。
  • 用户:最终使用应用程序的人。
  • 硬件与软件平台:运行的基础环境。

所以,三者的关系是:DBS ⊇ DBMS ⊇ DB 吗?不,更准确的关系是:数据库系统(DBS)包含了数据库(DB)和数据库管理系统(DBMS),以及相关人员、应用和平台。DBMS是DBS的核心软件组件,而DB是DBMS管理的对象。

提示:理解这个层次关系,能帮助你在遇到问题时快速定位。是SQL语句写错了(应用/用户层问题)?是MySQL服务挂了(DBMS层问题)?还是磁盘满了导致数据无法写入(硬件/DB存储层问题)?

为什么数据独立性在数据库阶段最高?这要追溯到数据管理的发展史:

阶段特点数据独立性典型问题
人工管理数据与程序一一对应,不保存,无专门软件管理无数据大量冗余,无法共享
文件系统数据以文件形式长期保存,由文件系统管理较低(物理独立性)数据冗余、不一致,程序依赖文件结构
数据库系统数据由DBMS统一管理,三级模式结构(外模式、模式、内模式)高(物理与逻辑独立性)复杂度高,需要专业DBA

数据库系统通过三级模式两级映像实现了高度的数据独立性。模式是数据的全局逻辑结构,外模式是用户看到的局部逻辑结构,内模式是数据的物理存储结构。DBMS负责外模式/模式映像和模式/内模式映像。当物理存储结构改变(比如换一块更快的SSD,改变文件存储格式)时,只需调整模式/内模式映像,而上层的模式和应用程序无需改动,这就是物理独立性。当全局逻辑结构改变(比如增加一个新字段)时,如果某个外模式不涉及这个字段,那么通过调整外模式/模式映像,对应的用户程序也无需改动,这就是逻辑独立性。这种架构,是数据库能成为现代应用基石的关键。

2. SQL:与数据库对话的通用语言

SQL(结构化查询语言)是我们与MySQL这类关系型数据库沟通的桥梁。它的特点鲜明,使其成为经久不衰的标准。

首先,SQL是集成的。它不像某些编程语言需要不同的库来处理不同任务。在SQL中,你可以用一套语言完成所有工作:

  • 数据定义语言(DDL):创建、修改、删除数据库对象。如 CREATE DATABASE, ALTER TABLE, DROP INDEX。
  • 数据操纵语言(DML):对表中的数据进行增删改查。如 INSERT, UPDATE, DELETE, SELECT。
  • 数据控制语言(DCL):控制数据访问权限。如 GRANT, REVOKE。
  • 事务控制语言(TCL):管理事务。如 COMMIT, ROLLBACK, SAVEPOINT。

其次,SQL是声明式的。你只需要告诉数据库“你想要什么”(What),而不需要指定“如何得到它”(How)。例如,你写 SELECT name FROM users WHERE age > 25;,你关心的是结果,至于数据库是先用索引找到age>25的记录再取name,还是全表扫描后再过滤,这个执行路径(How)由DBMS的查询优化器决定。这极大地提高了开发效率,也让优化器有机会选择最优的执行计划。

让我们看一个创建表并操作的完整例子,来感受SQL的各个部分:

-- DDL: 创建一个学生表
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age TINYINT UNSIGNED,
    gender ENUM('M', 'F'),
    enrollment_date DATE DEFAULT (CURRENT_DATE)
);

-- DML: 插入数据
INSERT INTO student (name, age, gender) VALUES ('张三', 20, 'M');
INSERT INTO student (name, age, gender) VALUES ('李四', 22, 'F');

-- DML: 查询数据
SELECT id, name FROM student WHERE age >= 21;

-- DML: 更新数据
UPDATE student SET age = 23 WHERE name = '李四';

-- TCL: 假设我们有一系列更新操作,希望原子性执行
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE user_id = 1;
UPDATE account SET balance = balance + 100 WHERE user_id = 2;
-- 如果此时检查发现一切正常,则提交
COMMIT;
-- 如果中途出错,可以回滚:ROLLBACK;

-- DCL: 授予另一个用户查询权限 (假设用户'readonly'存在)
GRANT SELECT ON mydb.student TO 'readonly'@'localhost';

关于SQL的一个常见“陷阱”是对NULL值的处理。NULL表示缺失或未知的值,它不是空字符串'',也不是数字0。任何与NULL进行的算术或比较运算,结果都是NULL(除了IS NULL和IS NOT NULL操作符)。聚合函数如COUNT(*)会计算所有行数,包括NULL行;而COUNT(column_name)会忽略该列为NULL的行。SUM(), AVG(), MAX(), MIN()同样会忽略NULL值。理解NULL的语义,是写出正确SQL的关键。

3. 存储引擎:MySQL的“可插拔心脏”

如果说数据库是一辆车,那么存储引擎就是它的发动机。MySQL的一个独特优势在于其可插拔的存储引擎架构。这意味着你可以为不同的表,根据其访问模式,选择最合适的存储引擎。使用 SHOW ENGINES; 命令可以查看当前MySQL实例支持的所有引擎。

最常用的两种引擎是InnoDB和MyISAM,但它们的特性截然不同:

特性InnoDBMyISAM
事务支持支持 (ACID兼容)不支持
行级锁支持 (写操作只锁单行)表级锁 (写操作锁全表)
外键约束支持不支持
崩溃恢复支持 (通过事务日志)较弱,表易损坏
全文索引支持 (MySQL 5.6+)支持
存储限制64TB256TB
适用场景需要事务、高并发写、数据一致性要求高的场景(如订单、账户系统)主要读操作、不需要事务、并发写低的场景(如日志分析、数据仓库)

注意:自MySQL 5.5版本起,InnoDB已经成为默认的存储引擎。除非有非常特殊的理由(并且你完全清楚其后果),否则在新项目中都应该使用InnoDB。那道选择题中描述“MyISAM是事务型数据库的首选引擎”显然是错误的,正确的描述对象应该是InnoDB。

那么,如何为表指定存储引擎呢?在创建表时使用ENGINE子句即可:

-- 创建一个使用InnoDB引擎的用户表
CREATE TABLE users_innodb (
    user_id INT PRIMARY KEY,
    username VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 创建一个使用MyISAM引擎的日志表(仅作示例,现在不推荐)
CREATE TABLE access_log_myisam (
    log_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    ip_address VARCHAR(45),
    access_time DATETIME,
    url TEXT,
    INDEX idx_time (access_time)
) ENGINE=MyISAM;

除了选择,我们还需要理解引擎背后的机制。比如,为什么InnoDB支持事务而MyISAM不支持? 核心在于日志。InnoDB使用重做日志(Redo Log) 和回滚日志(Undo Log) 来保证事务的持久性(Durability)和原子性/一致性(Atomicity/Consistency)。当事务提交时,修改先写入Redo Log(顺序写,速度快),再异步刷盘到数据文件。即使系统崩溃,重启后也能根据Redo Log重做已提交的事务。Undo Log则用于在事务回滚或MVCC(多版本并发控制)时,找到数据修改前的版本。

而MyISAM直接将数据写入数据文件,没有这种日志机制,所以无法保证在系统崩溃时数据的完整性,也无法实现回滚操作。

另一个关键区别是锁的粒度。InnoDB的行锁使得多个写操作可以同时修改同一表的不同行,大大提升了高并发写场景下的性能。而MyISAM的表锁,在任何一个写操作进行时,都会锁住整个表,导致其他所有读写操作都被阻塞。在Web应用等高并发环境下,这通常是不可接受的。

4. 数据定义与约束:构建健壮的数据蓝图

创建表不仅仅是定义几个字段名和类型,更是为数据完整性建立一套规则。这就像盖房子前画的设计图,决定了房子的结构和稳固性。

数据类型是基石。选择不当的数据类型,会浪费存储空间、影响查询性能,甚至导致数据错误。比如那道关于TINYINT的题,它占用1字节,有符号范围是-128~127,无符号范围是0~255。所以它无法存储256。常见数值类型的选择策略如下:

  • TINYINT: 状态标志(如0/1)、小范围枚举值。
  • SMALLINT: 中等范围ID、年份(如2023)。
  • INT 或 INTEGER: 最常用的主键ID类型,范围足够大。
  • BIGINT: 需要非常大范围的ID(如分布式系统生成的雪花ID)。
  • DECIMAL(M, D): 需要精确计算的金融数据,M是总位数,D是小数位数。
  • FLOAT / DOUBLE: 科学计算数据,可接受精度损失。

字符串类型也需谨慎选择:

  • CHAR(N): 定长字符串。适合长度固定的数据,如国家代码(‘CN’, ‘US’)、MD5哈希值(32位)。查询速度通常比VARCHAR快。
  • VARCHAR(N): 变长字符串。适合长度变化大的数据,如用户名、地址。N指的是字符最大长度,实际存储占用为“实际长度 + 1或2个字节的长度标识”。
  • TEXT: 长文本数据。有TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT之分,根据内容大小选择。

约束则是保证数据正确性的规则。主键和外键构成了关系型数据库的“关系”核心。

  • 主键约束(PRIMARY KEY):唯一标识表中的每一行。一个表只能有一个主键(但主键可以由多个列组成,称为复合主键)。主键列不允许NULL值,且自动创建唯一索引。

    -- 单列主键
    CREATE TABLE products (
        product_id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100)
    );
    -- 复合主键
    CREATE TABLE order_items (
        order_id INT,
        product_id INT,
        quantity INT,
        PRIMARY KEY (order_id, product_id) -- 联合主键
    );
    
  • 外键约束(FOREIGN KEY):建立表与表之间的关联,确保引用完整性。它指向另一张表的主键或唯一键。一个表可以有多个外键。外键约束可以定义在创建表时或之后添加。

    -- 创建带外键的表
    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        user_id INT,
        FOREIGN KEY (user_id) REFERENCES users(user_id)
            ON DELETE CASCADE -- 当users表中的记录被删除时,此订单也自动删除
            ON UPDATE NO ACTION -- 当users.user_id更新时,不做操作(默认)
    );
    -- 为已有表添加外键
    ALTER TABLE order_items
    ADD CONSTRAINT fk_order
    FOREIGN KEY (order_id) REFERENCES orders(order_id);
    

    外键的更新/删除行为需要仔细考虑:

    • CASCADE: 级联操作。主表变,从表跟着变。
    • SET NULL: 主表记录删除/更新后,从表外键列设为NULL。
    • RESTRICT / NO ACTION: 拒绝主表的删除/更新操作(如果存在关联从表记录)。
    • SET DEFAULT: 设为默认值(需字段有默认值定义)。
  • 其他约束:

    • 唯一约束(UNIQUE):保证列(或列组合)的值唯一,但允许NULL值(多个NULL被视为不相等?在MySQL中,唯一约束允许存在多个NULL值,因为NULL不等于任何值,包括NULL本身)。
    • 非空约束(NOT NULL):强制列不能为NULL。
    • 检查约束(CHECK):定义列值必须满足的条件(如age > 0)。注意:在MySQL 8.0.16之前,CHECK约束会被解析但被忽略执行。8.0.16及之后版本才真正支持。因此,在旧版本中,通常用触发器或应用程序逻辑来实现业务规则校验。
    • 默认值(DEFAULT):当插入数据未指定该列值时,使用默认值。

使用DESCRIBE table_name;或SHOW CREATE TABLE table_name;可以查看表的结构和所有约束定义。

5. 索引:加速数据检索的“目录”

没有索引的数据库查询,就像在一本没有目录的百科全书中查找一个特定词条——你必须逐页翻阅。索引就是这本书的目录,它能极大地加速数据检索速度。

索引的本质是一种数据结构(最常见的是B+树),它存储了表中某一列或多列的值,以及这些值对应数据行的物理地址(或主键值)。当执行WHERE、ORDER BY、JOIN或GROUP BY涉及索引列时,数据库可以直接在索引结构中查找,避免全表扫描。

创建索引的基本语法:

-- 创建普通索引(允许重复值)
CREATE INDEX idx_student_grade ON student(grade);
-- 或使用ALTER TABLE
ALTER TABLE student ADD INDEX idx_student_grade (grade);

-- 创建唯一索引(不允许重复值)
CREATE UNIQUE INDEX idx_user_email ON users(email);

-- 创建主键索引(创建主键时自动创建)
ALTER TABLE student ADD PRIMARY KEY (sid);

-- 创建复合索引(多列)
CREATE INDEX idx_name_age ON employees(last_name, first_name, age);

复合索引的使用需要理解“最左前缀匹配原则”。对于索引(last_name, first_name, age):

  • 能有效加速的查询:WHERE last_name='Smith', WHERE last_name='Smith' AND first_name='John', WHERE last_name='Smith' AND first_name='John' AND age=30, WHERE last_name='Smith' AND age=30(但只用到last_name部分,age作为过滤条件)。
  • 不能有效加速的查询:WHERE first_name='John', WHERE age=30, WHERE first_name='John' AND age=30。因为索引是从最左边的列开始匹配的。

那么,是不是索引越多越好?绝对不是。索引有代价:

  1. 空间开销:索引需要额外的磁盘空间。
  2. 维护开销:对表进行INSERT、UPDATE、DELETE操作时,数据库需要同步更新相关的索引,这会降低写操作的性能。

因此,创建索引需要权衡。适合创建索引的列包括:

  • 主键和外键列(通常自动创建)。
  • 在WHERE子句中频繁作为查询条件的列。
  • 用于连接(JOIN)的列。
  • 在ORDER BY或GROUP BY中使用的列。
  • 选择性高的列(即列中不同值多,重复值少)。例如,性别列(只有‘M’,‘F’)选择性低,创建索引效果甚微;而用户名、邮箱列选择性高,索引效果好。

不适合或需要谨慎创建索引的情况:

  • 表非常小(全表扫描可能更快)。
  • 列的值取值范围很少,重复度极高(低选择性)。
  • 写操作(增删改)远远多于读操作的表。
  • BLOB、TEXT或很长的VARCHAR列(如果必须,可以考虑前缀索引CREATE INDEX idx_text ON table_name(text_column(20));,只对前20个字符索引)。

索引是数据库性能调优中最重要也最复杂的领域之一。理解其工作原理,并结合EXPLAIN命令分析查询执行计划,是每个后端开发者必备的技能。例如,执行EXPLAIN SELECT * FROM student WHERE grade > 90;,可以查看MySQL是否使用了我们创建的idx_student_grade索引,以及扫描了多少行数据。

6. 视图:简化复杂查询的安全层

视图(View)是一个虚拟表,其内容由查询定义。它不存储数据,数据仍然存储在基表中。当你查询视图时,数据库会执行定义视图时的查询语句。

创建视图的语法很简单:

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition
[WITH CHECK OPTION]; -- 可选,用于可更新视图

视图主要有两大用途:

  1. 简化复杂查询:将复杂的连接、子查询、聚合等逻辑封装成一个简单的视图,让应用程序可以像查询普通表一样使用它。

    -- 创建一个显示学生详细成绩的视图
    CREATE VIEW student_detail_score AS
    SELECT s.sid, s.name, c.cname, sc.grade
    FROM student s
    JOIN score sc ON s.sid = sc.sid
    JOIN course c ON sc.cid = c.cid;
    
    -- 之后,应用程序可以简单地查询
    SELECT * FROM student_detail_score WHERE name = '张三';
    
  2. 数据安全与抽象:可以只向用户暴露视图,而不是底层基表,从而隐藏敏感数据或复杂结构。

    -- 只向财务部门开放员工的薪资视图,且不包含敏感信息如身份证号
    CREATE VIEW finance_employee AS
    SELECT emp_id, name, department, salary
    FROM employees;
    
    -- 授予财务用户对此视图的查询权限,而非整个employees表
    GRANT SELECT ON mydb.finance_employee TO 'finance_user'@'localhost';
    

关于视图,有几个重要的限制需要了解:

  • 可更新性:并非所有视图都可以进行INSERT、UPDATE、DELETE操作。通常,基于单表的简单视图(不含聚合、分组、去重、子查询等)是可更新的。而来自多个基表的视图(即使通过JOIN连接)通常不可更新,因为数据库无法确定修改应作用于哪个基表。
  • WITH CHECK OPTION:对于可更新视图,这个选项确保通过视图进行的修改(INSERT或UPDATE)必须满足视图定义中的WHERE条件。例如,一个视图只显示age > 18的学生,如果加上WITH CHECK OPTION,那么通过这个视图插入一个age=16的学生记录将会失败。
  • ORDER BY限制:在视图定义的SELECT语句中,除非与LIMIT一起使用,否则通常不允许使用ORDER BY子句,因为视图代表的是一个表,而表本身是无序的集合。

视图是数据库设计中的一个强大工具,它能提升代码的复用性和可维护性,同时加强数据访问控制。但在性能敏感的场合要小心,因为视图的查询最终会转换为对基表的查询,复杂的视图定义可能导致性能问题。

7. 备份与恢复:数据安全的生命线

数据是无价的。硬件故障、软件错误、人为误操作(比如著名的DROP TABLE)都可能导致数据丢失。一个可靠的备份与恢复策略,是数据库管理的重中之重。

MySQL的备份主要分为逻辑备份和物理备份两大类。

逻辑备份保存的是数据库的逻辑结构(CREATE语句)和数据(INSERT语句)。最常用的工具是mysqldump。它的优点是:

  • 可读性强,备份文件是SQL文本。
  • 兼容性好,可以在不同版本、甚至不同类型的MySQL数据库间恢复(需注意版本差异)。
  • 可以灵活备份单个数据库、单张表或所有数据库。
  • 备份粒度细。
# 备份整个数据库到文件
mysqldump -u root -p --databases mydb > mydb_backup.sql

# 备份单个表
mysqldump -u root -p mydb mytable > mytable_backup.sql

# 只备份结构(不包含数据)
mysqldump -u root -p --no-data mydb > mydb_schema.sql

# 只备份数据(不包含结构)
mysqldump -u root -p --no-create-info mydb > mydb_data.sql

物理备份直接复制数据库的物理文件(数据文件、日志文件等)。常用方法有:

  • 文件系统快照(如LVM)。
  • 使用Percona XtraBackup等第三方工具(支持在线热备,不影响业务)。 物理备份的优点是速度快,恢复快,适合大数据量。但缺点是备份文件与存储引擎、MySQL版本甚至操作系统关联性强,移植性较差。

按备份时数据库的运行状态,可分为:

  • 冷备份:关闭数据库服务后进行备份。简单安全,但需要停机。
  • 温备份:数据库服务运行,但锁定表(只读)后进行备份。会有短暂的只读窗口。
  • 热备份:数据库服务正常运行,读写不受影响的情况下备份。对技术要求高,通常需要特定工具或存储引擎支持(如InnoDB + XtraBackup)。

按备份的数据范围,可分为:

  • 完整备份:备份所有数据。是恢复的基础。
  • 增量备份:备份自上一次备份(无论是完整还是增量)以来发生变化的数据。节省时间和空间。
  • 差异备份:备份自上一次完整备份以来发生变化的数据。恢复时只需要完整备份和最后一次差异备份。

二进制日志(Binary Log) 在备份恢复中扮演着关键角色。它记录了所有对数据库进行更改的SQL语句(DDL和DML)。结合mysqldump和二进制日志,可以实现基于时间点的恢复(PITR):

  1. 首先,有一个完整备份(比如周日凌晨的mysqldump)。
  2. 然后,数据库在运行,二进制日志不断产生。
  3. 周三中午,发生误操作,删除了重要数据。
  4. 恢复步骤:
    • 恢复周日的完整备份:mysql -u root -p mydb < sunday_backup.sql
    • 找到周日备份后到周三误操作前的所有二进制日志文件。
    • 使用mysqlbinlog工具,将这些二进制日志“重放”到数据库,但停在误操作发生之前。
    mysqlbinlog --stop-datetime="2023-10-25 11:59:59" binlog.000001 binlog.000002 ... | mysql -u root -p
    
    这样,数据就恢复到了误操作发生前的瞬间。

制定备份策略时,需要考虑RPO(恢复点目标) 和RTO(恢复时间目标)。能容忍丢失多少数据?需要多快恢复?根据答案来决定备份的频率和方式。对于生产系统,定期完整备份 + 实时二进制日志是常见的组合,它能在数据安全和恢复效率之间取得良好平衡。记住,没有经过恢复测试的备份,等于没有备份。定期进行恢复演练至关重要。

MySQL Connector/J 5.1.40 Java数据库连接驱动实战应用 Java Database Connectivity(JDBC)是Java平台中用于统一访问关系型数据库的标准API,定义了Java应用与数据库驱动之间的接口规范。JDBC通过ConnectionStatement和ResultSet等核心接口,屏蔽底层数据库差异,实现“一次编写,处处运行”的数据库操作能力。其四层架构包括:应用程序层、JDBC API层、驱动实现层与数据库协议层,形成从Java代码到SQL执行的完整链路。 阅读详情

相关推荐

MySQL 5.6.40:性能提升与插件化深度定制

MySQL查询优化器使用一系列的优化策略和算法来优化查询。其中,最重要的策略包括:全外连接消除:对不必要的全外连接进行消除,避免产生大量的数据。子查询优化:将某些类型的子查询改写为连接操作,因为连接操作通常更加高效。索引选择:选择最合适的索引来减少数据查找的成本。排序优化:在可能的情况下避免全表排序,利用索引来提高排序效率。优化器也依赖于成本模型来评估不同执行计划的成本。这个模型考虑了多种因素,如I/O操作次数、内存使用、CPU消耗等。

weixin_35696112的博客 1035

小白必看:VMware中文设置图文详解

对新手特别友好,不需要安装任何软件,直接在网页上就能完成各种开发环境的配置。像我这样的小白用户也能快速上手,遇到问题还能随时查看社区分享的解决方案。特别是他们的一键部署功能,省去了很多繁琐的环境配置步骤,真的很适合初学者练手。中文界面能大大降低学习曲线,特别是对不熟悉计算机术语的新手来说。建议刚开始使用时保持中文界面,等熟悉后再切换回英文,这样对专业术语的理解会更准确。对于刚接触VMware的新手来说,英文界面确实是个不小的障碍。其实VMware是支持多语言的,只是默认安装后不会自动切换。

BlackStone33的博客 2102

步进电机选型避雷手册:为什么你的42HS电机总丢步?从相数、电流到散热全面拆解

本文深入剖析了42HS步进电机在高速或重载下易出现丢步问题的根本原因。文章指出,选型时不应仅关注静态保持转矩,而需重点分析动态矩频曲线、合理匹配驱动器电流与细分数、进行准确的机械传动惯量计算,并有效管理系统共振与散热。通过全面拆解这些关键因素,为工程师提供了实用的选型避雷指南与系统优化方案。

weixin_29275257的博客 97

MySQL基础知识面试选择题40

1.数据库系统的核心是_B_。 A.数据库 B.数据库管理系统 C.数据模型D.软件工具 2.SQL语言包括_ABCD_。(多选) A.DCL B.DML C.DDL D.DQL 解析: DDL(Data definition language):数据库定义语言, DML(Data manipulation language...

蚂蚁 9812

给新人的储能系统入门图解:从电芯到EMS,一张图看懂BESS里那些‘黑话’

本文通过视觉化拆解储能系统,从电芯到EMS详细解析BESS中的关键组件和行业术语。涵盖电芯参数、模组组装、PCS功能、BMS与EMS分工,以及SOC、DOD等关键运维参数,帮助新人快速理解储能系统的核心技术和应用场景。

weixin_42522964的博客 594

矿卡CMP 170HX的AI推理性能优化实战

GPU计算在现代AI推理中扮演着核心角色,其并行计算架构特别适合处理神经网络的大规模矩阵运算。通过CUDA指令集优化和计算管线重构,可以显著提升硬件利用率,这在边缘计算和带宽敏感型任务中尤为重要。以NVIDIA CMP 170HX矿卡为例,通过禁用FMA指令和框架适配优化,其FP32性能可提升15.9倍,在Qwen2.5-1.5B模型的4-bit量化推理中达到A100同架构78%的解码速度。这种优化技术不仅让淘汰矿卡重获新生,更为边缘AI部署提供了高性价比解决方案,特别适合7B以下量化模型部署和多路视频分析

weixin_30432579的博客 633

MySQL经典50道练习题及全网最详细解析

MySQL经典50道练习全网最详细解析

hujieliang123的博客 1万+

从零开始STM32cubeide学习

使用的是正点原子的精英版,单片机是STM32F103ZET6,详细讲解完成跑马灯实验

weixin_44077208的博客 2281

MySQL JSON深度解析及使用实例:从基础到实战

在数据库领域,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、灵活和广泛的应用场景,逐渐成为现代数据库的重要组成部分。MySQL作为全球最受欢迎的关系型数据库之一,早在5.7版本就引入了对JSON数据类型和相关函数的支持。本文将从JSON的基础概念、存储与查询机制、性能优化以及实际应用案例等多个维度,全面解析MySQL中JSON的使用与优化策略。

兀行者的博客 1005

当图像配准遇见边缘计算:低功耗设备的优化实践

本文探讨了在边缘计算环境下优化图像配准技术的实践方法,重点解决低功耗设备如树莓派和Jetson Nano上的算力瓶颈问题。通过算法轻量化、硬件加速和内存优化等策略,实现了毫秒级图像配准,适用于智能安防、移动医疗等实时性要求高的场景。

weixin_29054195的博客 388

NVIDIA DGX Spark (Ubuntu 24.04) 部署Isaac Sim与Isaac Lab:二进制安装与ROS2集成实战

本文详细介绍了在NVIDIA DGX Spark工作站(Ubuntu 24.04系统)上,通过预编译二进制包稳定部署Isaac Sim与Isaac Lab的完整实战流程。文章重点剖析了二进制安装相较于源码编译和pip安装的优势,有效规避了CUDA、PyTorch等关键组件的版本冲突陷阱,并逐步指导完成环境配置、Isaac Lab集成、Conda环境管理以及ROS2 Jazzy的集成,最终构建出完整的机器人仿真与强化学习开发平台。

kite3的博客 396

MySQL--30道核心概念实战解析与答案精讲

本文针对MySQL学习者从理论到实践的鸿沟,通过30个核心概念的深度实战解析,将基础概念选择题转化为可应用的解决方案。文章详细剖析了DBMS核心作用、存储引擎选择、数据类型约束、SQL查询优化(如JOIN与索引)、数据库设计范式及备份策略,旨在帮助读者构建扎实的MySQL知识体系,提升解决实际问题的能力。

weixin_29268637的博客 167

A算法的蒙特卡洛树搜索

A*算法的蒙特卡洛树搜索 作者:禅与计算机程序设计艺术 1. 背景介绍 在人工智能和游戏开发领域,搜索算法是一个非常重要的研究方向。其中A算法和蒙特卡洛树搜索是两种广泛应用的经典算法。A算法是一种启发式搜索算法,通过评估各个节点到目标节点的启发式代价来引导搜索方向,在

AI天才研究院 1744

mysql选择题解析_数据库选择题及答案

在数据库中储存选择题,要设置几张表好呢?建议这样建题目表(编号id, 标题, 题目内容)选项表(题目编号id, 选项)答案表(题目编号id, 答案)查询的时候就select 选项 from 选项表 where 题目编号id = XXX当然你哪样建也是可以的,只是在查询和处理的时候写起来比较麻烦罢了我需要用Mysql建一个数据库,数据库里存放选择题判断题之类的数据,数据库不需要导入,可以让Andro...

weixin_42132598的博客 6321

使用ClickHouse JDBC官方驱动,踩坑无数

这个问题我在网上查原因说是由于Zookeeper压力过大,表变成只读状态,导致ClickHouse插入数据失败。写入数据频率过高。Zookeeper中的集群节点挂掉。而我们项目出现这个问题的原因是第一个:写入数据频率过高。但是在网上搜资料的过程中,我又发现了另外一个问题:我们项目用了JDBC驱动,但ClickHouse官方并不推荐。。证实了官网确实不建议使用驱动:而应该改成驱动,并且推荐使用0.3.2以上的版本:于是,后面几天开始了ClickHouse的JDBC驱动升级之旅。

2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MySQL 排序与分页实战:3 道经典练习题解析

本文通过3道MySQL练习题解析排序(ORDER BY)和分页(LIMIT)的核心用法:1)多条件排序示例,展示如何按年薪降序和姓名升序组合排序;2)条件筛选+分页场景,演示如何排除指定薪资范围并提取21-40条记录;3)函数排序案例,说明如何按邮箱长度降序排列。文章强调排序分页常需结合条件筛选、函数计算等操作,并总结关键语法要点,包括多列排序规则、分页偏移量计算和字符串处理函数等技巧,帮助开发者高效处理各类数据展示需求。

m0_60277481的博客 996

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MYSQL数据库SQL语句基础练习—— 40道经典练习题详解(含练习数据库)

题目:列出各种类别工作(分组)的最低工资基本的按职位分组查询最低工资与第36题相同,展示了GROUP BY的基本用法:提取子字符串UPPER(str)LOWER(str):大小写转换:字符串连接:用分隔符连接:字符串替换:字符串长度通过这40道SQL基础练习题,我们系统地学习了SQL的核心语法和常用函数。掌握这些基础知识对于数据库操作和数据分析非常重要。建议在实际项目中多加练习,熟练掌握这些SQL技巧。

2301_80436820的博客 3880

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MySQL面试必刷40题:从零基础到通关的实战指南(附答案解析)

本文提供MySQL面试必刷40题的深度解析与实战策略,涵盖数据库基础架构、SQL语句优化、数据库设计规范及高级特性等核心内容。通过选择题解析和实战案例,帮助读者掌握MySQL基础概念与面试应答技巧,适合从零基础到进阶的学习者提升数据库技能。

weixin_42522552的博客 128

牛客40道MySql

本文介绍了三个SQL查询案例:1) 使用LIMIT 2查询前2个用户设备ID;2) 使用AS将查询结果的列名改为"user_infos_example"并限制返回2行;3) 筛选北京大学的学生信息。这些案例展示了SQL中结果集限制、列重命名和条件筛选的基本操作。

Miketutu的博客 384

“68道 Redis+168道 MySQL”精品面试题(带解析),你背废了吗?

谈起 Redis 和 MySQL,皆是广大 程 序 猿(媛)朋友面试跳槽必踩的两个坑。那么,关于Redis与MySQL,面试官最爱问哪些问题呢?不知道也不用慌,我已整理了这速来试试你 背 “废” 了吗?

jcc4261的博客 722

MySQL索引优化实战:从基础到高级应用的全面解析

电商平台典型场景:经常按"商品分类+价格+销量"组合查询时,应建立(category,price,sales)的复合索引。索引是数据库中的"目录系统",通过B+树等数据结构实现快速定位。在用户表查询场景中,合理的索引能将查询时间从毫秒级降至微秒级。实际测试显示,10万条数据的姓名查询无索引耗时120ms,添加索引后仅需3ms。用户中心案例:查询用户基本信息时,建立包含(username,age,gender)的覆盖索引,比仅索引username减少40%的I/O操作。实测显示查询耗时从8ms降至3ms。

LapisLion88的博客 746

lesson40:PyMySQL完全指南:从基础到高级的Python MySQL交互

本文全面介绍了Python操作MySQL数据库的首选驱动PyMySQL。内容涵盖环境配置、核心功能、安全实践、高级应用架构及实战案例,重点讲解了SQL注入防护、连接池优化、ORM集成等关键知识点。通过用户认证系统、数据ETL管道等三个实战项目,展示了PyMySQL在企业级应用中的完整解决方案。文章还提供了性能调优指南和异常处理体系,帮助开发者构建高效安全的数据库应用。最后推荐了官方文档和进阶书籍等学习资源,适合从入门到精通的各阶段开发者参考。

2402_82363599的博客 1753

lesson35:数据库深度解析:从概念到MySQL实战学习指南

学习完Python基础后结束了第一阶段的学习,现在开始第二阶段,从数据库开始学习。

2402_82363599的博客 1134
上一篇: 当骁龙845遇上Win11:小米Mix2S刷机后能做哪些生产力测试?
下一篇: M3DM之后:从‘混合融合’到‘协同蒸馏’,多模态异常检测的演进之路
python9snake
博客等级 码龄1天 0粉丝 1724原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值