Mysql--15

一、count 性能对比

性能从快到慢:count (*) ≈ count (1) > count (主键 id) > count (字段)

  • count(*):InnoDB 做了专门优化,不读取具体数据,直接统计行数,性能最高。
  • count(1):效果与 count(*) 基本一致,略低一点点。
  • count(主键id):需要读取主键值,性能稍差。
  • count(字段):需要判断字段是否为 NULL,只统计非空值,性能最差。

sql

复制代码
-- 统计全表总行数(推荐)
SELECT COUNT(*) FROM user;

-- 统计某字段非空行数
SELECT COUNT(email) FROM user;

二、InnoDB 行锁原理

InnoDB 的行锁是针对索引加的锁,不是直接对记录加锁。如果索引失效,行锁会升级为表锁,导致并发性能急剧下降。

sql

复制代码
-- 正确:基于索引字段更新,使用行锁
UPDATE user SET age=20 WHERE id=1001;

-- 错误:无索引字段更新,行锁升级为表锁
UPDATE user SET age=20 WHERE nickname='test';

三、limit 分页优化

深分页场景(如 limit 1000000,10)性能较差,优化方案:使用覆盖索引 + 子查询,先通过索引定位 ID,再关联查询数据,减少回表与扫描行数。

sql

复制代码
-- 普通深分页:效率低
SELECT * FROM product ORDER BY id LIMIT 2000000, 10;

-- 优化后:先查ID再回表
SELECT t.* FROM product t
JOIN (SELECT id FROM product ORDER BY id LIMIT 2000000, 10) a
ON t.id = a.id;

四、视图(View)

  1. 视图是虚拟表,只保存 SQL 查询逻辑,不存储真实数据。
  2. 每次查询视图时,都会重新执行对应的 SELECT 语句。
  3. 可以简化复杂查询、做权限控制、统一查询口径。

sql

复制代码
-- 创建视图
CREATE VIEW v_user_order AS
SELECT u.id, u.name, o.order_no, o.amount
FROM user u
LEFT JOIN `order` o ON u.id = o.user_id;

-- 使用视图
SELECT * FROM v_user_order WHERE id=1001;

-- 删除视图
DROP VIEW IF EXISTS v_user_order;

五、SQL 优化通用要点

  • 插入优化:批量插入、手动事务、主键顺序插入、大批量用 load data。

sql

复制代码
-- 批量插入优化
INSERT INTO user(name,age) VALUES
('张三',20),
('李四',21),
('王五',22);
  • 主键优化:长度尽量短、使用自增有序主键、避免 UUID 等无序主键。

sql

复制代码
CREATE TABLE user(
    id BIGINT PRIMARY KEY AUTO_INCREMENT,  -- 有序自增主键
    name VARCHAR(20)
);
  • order by 优化:尽量让排序字段走索引,避免 using filesort。

sql

复制代码
-- 排序走索引
SELECT id,name FROM user ORDER BY id;
  • group by 优化:利用索引分组,避免产生临时表。

sql

复制代码
SELECT age,COUNT(*) FROM user GROUP BY age;
  • update 优化:务必根据索引字段更新,防止行锁升级为表锁。

sql

复制代码
UPDATE user SET status=1 WHERE id IN (1,2,3);
相关推荐
Decay__3 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
小徐不徐说7 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠8 小时前
泛微OAe9-后端二开异步调用
java
Decay__8 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
秋天的怀念_David8 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放9 小时前
Python基础语法练习题(73)
java·前端·python