- sql的书写顺序和执行顺序
SELECT[DISTINCT]字段/表达式-- 5. 筛选返回的字段FROM表名[别名]-- 1. 指定查询的数据源表[JOIN关联表[别名]ON关联条件]-- 2. 执行表关联操作WHERE过滤条件-- 3. 过滤行数据(分组前)GROUPBY分组字段-- 4. 按字段分组HAVING分组过滤条件-- 6. 过滤分组结果(分组后)ORDERBY排序字段[ASC/DESC]-- 7. 对结果集排序LIMIT/OFFSET分页参数-- 8. 限制返回行数(不同数据库关键字有差异)mysql中的索引
- 主键索引(PRIMARY KEY)
- 唯一标识表中每行数据,一张表只能有一个;
- 主键字段非空(NOT NULL)且唯一,InnoDB 中主键索引是聚簇索引,性能最优;
- 建议使用自增 INT/BIGINT 作为主键(避免页分裂),而非 UUID(无序,导致索引碎片)。
- 唯一索引(UNIQUE)
- 保证索引列的值唯一(允许 NULL,多个 NULL 不冲突);
- 一张表可创建多个唯一索引;
- 适用场景:手机号、邮箱等需唯一约束的字段,既保证唯一性,又加速查询。
- 普通索引(INDEX)
- 最基础的索引,无唯一性、非空约束,仅用于加速查询;
- 一张表可创建多个,适用于频繁作为查询条件的字段(如订单表的 user_id)。
- 组合索引(复合索引)
- 基于多个字段创建的索引(如INDEX idx_name_age (name, age));
- 遵循「最左前缀原则」:查询条件需匹配索引字段的最左列开始的连续子集(如WHERE name='张三’可用,WHERE age=20不可用);
- 适用场景:多字段联合查询(如WHERE name=‘张三’ AND age=20),减少回表次数。
- 前缀索引
- 对字符串类型字段的前 N 个字符创建索引(如INDEX idx_name (name(10)));
- 优点:减少索引占用空间,提升索引效率;
- 缺点:无法用于排序 / 分组(若前缀长度不足);
- 适用场景:长字符串字段(如手机号、身份证号,前几位已能区分)。
- 覆盖索引
- 不是独立的索引类型,而是一种查询优化场景:索引包含查询所需的所有字段(如查询SELECT id, name FROM user WHERE age=20,若有INDEX idx_age_name (age, name),则无需回表);
- 优点:避免回表,大幅提升查询效率;
- 适用场景:高频查询且字段较少的场景(如列表页查询)。