CREATE INDEX idx_column_name ON table_name(column_name);
联合索引 :
如果查询中涉及多个条件,可以创建联合索引。注意最左前缀原则。
sql复制代码
CREATE INDEX idx_multi_columns ON table_name(column1, column2);
覆盖索引 :
通过索引覆盖查询的所有字段,减少回表操作。
sql复制代码
SELECT col1, col2 FROM table_name WHERE col1 = 1;
避免冗余索引 :
合理设计索引,避免不必要的重复索引。例如 (a, b) 的索引已经可以覆盖 a 的查询,没必要再单独为 a 创建索引。
3. SQL 查询优化
优化 SQL 查询语句本身是提高性能的重要手段。
避免 SELECT * :
只查询必要的字段,减少数据传输量。
sql复制代码
SELECT col1, col2 FROM table_name WHERE condition;
避免子查询,改用 JOIN :
子查询在某些情况下会导致性能下降,特别是嵌套子查询。
sql复制代码
-- 子查询
SELECT * FROM table_name WHERE col1 IN (SELECT col1 FROM other_table);
-- 改为 JOIN
SELECT t1.* FROM table_name t1 JOIN other_table t2 ON t1.col1 = t2.col1;
-- 优化后的查询
SELECT * FROM orders WHERE id > 1000000 ORDER BY id ASC LIMIT 10;
通过 id > 1000000 确定游标位置,直接从符合条件的记录开始扫描。
查询性能与 OFFSET 无关,扫描范围大大缩小。
避免函数操作 :
不要在 WHERE 子句中对列使用函数,会导致索引失效。
sql复制代码
SELECT * FROM table_name WHERE DATE(column_name) = '2023-01-01'; -- 慢
SELECT * FROM table_name WHERE column_name >= '2023-01-01' AND column_name < '2023-01-02'; -- 快
减少 OR 的使用 : OR 通常会导致全表扫描,可以用 UNION 或 IN 代替。
sql复制代码
-- 原始查询:使用 OR,可能导致全表扫描
SELECT * FROM table_name WHERE col1 = 1 OR col1 = 2;
-- 优化方式 1:使用 IN,能够高效利用单列索引
SELECT * FROM table_name WHERE col1 IN (1, 2);
-- 优化方式 2:使用 UNION,将查询拆分成两个独立的部分
(SELECT * FROM table_name WHERE col1 = 1)
UNION
(SELECT * FROM table_name WHERE col1 = 2);
优化 LIKE 查询 : LIKE 查询如果以 % 开头会导致全表扫描,因为无法使用索引。可以优化为前缀匹配或使用全文索引。
示例:
sql复制代码
-- 非优化:前缀为 %,无法使用索引
SELECT * FROM table_name WHERE col1 LIKE '%keyword%';
-- 优化:前缀匹配,能够使用索引
SELECT * FROM table_name WHERE col1 LIKE 'keyword%';
-- 使用全文索引(适用于大文本字段)
ALTER TABLE table_name ADD FULLTEXT(col1);
SELECT * FROM table_name WHERE MATCH(col1) AGAINST('keyword');