Mysql--15

张开发
2026/5/24 0:42:38 15 分钟阅读
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 age20 WHERE id1001; -- 错误无索引字段更新行锁升级为表锁 UPDATE user SET age20 WHERE nicknametest;三、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视图是虚拟表只保存 SQL 查询逻辑不存储真实数据。每次查询视图时都会重新执行对应的 SELECT 语句。可以简化复杂查询、做权限控制、统一查询口径。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 id1001; -- 删除视图 DROP VIEW IF EXISTS v_user_order;五、SQL 优化通用要点插入优化批量插入、手动事务、主键顺序插入、大批量用 load data。sql-- 批量插入优化 INSERT INTO user(name,age) VALUES (张三,20), (李四,21), (王五,22);主键优化长度尽量短、使用自增有序主键、避免 UUID 等无序主键。sqlCREATE 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 优化利用索引分组避免产生临时表。sqlSELECT age,COUNT(*) FROM user GROUP BY age;update 优化务必根据索引字段更新防止行锁升级为表锁。sqlUPDATE user SET status1 WHERE id IN (1,2,3);

更多文章