select语句(优化)

基本使用

SELECT * FROM books;

我们可以使用星号作为通配符来选择特定表中的所有列。上面的语句就是找出books表中所有的列。

如果我们只想查询某些列,我们将在逗号分隔的列表中将它们列出来代替星号:

SELECT isbn, title, author_id
FROM books;

这样就只选出来isbn,title,author_id三列。

注意:sql语句是可以分行写的哈,以分号结束

还可以限制输出的行数:

SELECT isbn, title, author_id
FROM books
LIMIT 5;

上面的语句执行结果是只输出前五行。

如果我们想获取第5行(不含第5行)往后的10行,那么:

SELECT isbn, title, author_id
FROM books
LIMIT 5, 10;

按条件、按顺序输出

仅列出author_id = 4729的书的isbn和title:

SELECT isbn, title
FROM books
WHERE author_id = 4729
LIMIT 5;

ORDER BY 子句

把查询到的结果用title的字母或数字作为排序顺序:

SELECT isbn, title
FROM books
WHERE author_id = 4729
ORDER BY title ASC
LIMIT 5;

使用order by子句对输出结果进行排序。

排序表达式后面的关键字ASC或DESC代表是升序还是降序,我们这里是升序。如果不指定,默认是升序。

order by子句还可以实现删除重复的条目。

实例演示:

# 创建表seq,并插入一些数据
CREATE TABLE seq (i INT, x VARCHAR(1));
INSERT INTO seq VALUES (1,'a'), (2,'b'), (3,'b'), (4,'f'), (5,'e');

# 列出所有内容,按照i列排序。默认是升序
SELECT * FROM seq ORDER BY i;
+------+------+
| i   | x   |
+------+------+
|   1 | a   |
|   2 | b   |
|   3 | b   |
|   4 | f   |
|   5 | e   |
+------+------+

# 列出所有内容,按照i列排序。我们用降序看看
SELECT * FROM seq ORDER BY i DESC;
+------+------+
| i   | x   |
+------+------+
|   5 | e   |
|   4 | f   |
|   3 | b   |
|   2 | b   |
|   1 | a   |
+------+------+

# 当有两个排序表达式的时候,先按第一个排序,如果第一个表达式的值相同,再按照第二个表达式的值排序
SELECT * FROM seq ORDER BY x,i;
+------+------+
| i   | x   |
+------+------+
|   1 | a   |
|   2 | b   |
|   3 | b   |
|   5 | e   |
|   4 | f   |
+------+------+

 

MySQL常用30种SQL查询语句优化方法

引言

 

在开发和维护MySQL数据库时,优化SQL查询语句是提高数据库性能和响应速度的关键。通过合理优化SQL查询,可以减少数据库的负载,提高查询效率,为用户提供更好的用户体验。本文将介绍常用的30种MySQL SQL查询优化方法,并通过实际案例演示它们的应用。

 

第一部分:基础优化方法

 

  1. 使用索引

 

索引是提高数据库查询性能的基础,通过为查询字段添加合适的索引,可以加快查询速度。在创建索引时,需要考虑查询的频率和数据的更新频率,避免过度索引或不必要的索引。

 

-- 创建索引

CREATE INDEX idx_column ON table_name(column_name);

 

  1. 避免使用SELECT *

 

在查询数据时,尽量避免使用SELECT *,而是明确指定需要查询的字段。这样可以减少返回的数据量,提高查询效率。

 

-- 不推荐

SELECT * FROM table_name;



-- 推荐

SELECT column1, column2 FROM table_name;

 

  1. 使用EXPLAIN分析查询计划

 

使用EXPLAIN命令可以分析查询的执行计划,帮助优化查询语句,查找潜在的性能问题。

 

EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';

 

第二部分:优化查询条件

 

  1. 使用WHERE子句过滤数据

 

在查询数据时,尽量使用WHERE子句对数据进行过滤,减少返回的数据量。

 

-- 不推荐

SELECT * FROM table_name;



-- 推荐

SELECT * FROM table_name WHERE column_name = 'value';

 

  1. 使用索引覆盖查询

 

索引覆盖查询是指查询的字段都包含在索引中,不需要回表查询数据。这样可以减少IO操作,提高查询效率。

 

-- 创建索引

CREATE INDEX idx_column ON table_name(column_name);



-- 索引覆盖查询

SELECT column1, column2 FROM table_name WHERE column_name = 'value';

 

  1. 避免在WHERE子句中使用函数

 

在WHERE子句中使用函数会导致索引失效,需要全表扫描。尽量避免在WHERE子句中使用函数。

 

-- 不推荐

SELECT * FROM table_name WHERE DATE_FORMAT(date_column, '%Y-%m-%d') = '2023-01-01';



-- 推荐

SELECT * FROM table_name WHERE date_column = '2023-01-01';

 

  1. 使用合适的数据类型

 

选择合适的数据类型可以减少存储空间和查询时间,提高数据库性能。

 

-- 不推荐

CREATE TABLE table_name (id VARCHAR(100), name VARCHAR(100));



-- 推荐

CREATE TABLE table_name (id INT, name VARCHAR(100));

 

第三部分:连接查询优化

 

  1. 使用INNER JOIN代替WHERE子句连接

 

使用INNER JOIN可以更好地表达表之间的关系,提高查询的可读性和性能。

 

-- 不推荐

SELECT * FROM table1, table2 WHERE table1.id = table2.id;



-- 推荐

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

 

  1. 使用JOIN ON代替WHERE子句过滤连接

 

在连接查询时,尽量使用JOIN ON对连接进行过滤,而不是在WHERE子句中过滤连接。

 

-- 不推荐

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id WHERE table2.name = 'value';



-- 推荐

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id AND table2.name = 'value';

 

  1. 使用合适的连接类型

 

根据实际业务需求选择合适的连接类型,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。

 

-- INNER JOIN(默认连接类型)

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;



-- LEFT JOIN

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;



-- RIGHT JOIN

SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;



-- FULL JOIN

SELECT * FROM table1 FULL JOIN table2 ON table1.id = table2.id;

 

第四部分:子查询优化

 

  1. 使用EXISTS代替IN

 

在使用子查询时,尽量使用EXISTS代替IN,EXISTS只关心是否存在记录,而IN会将子查询的结果集加载到内存中,可能导致性能问题。

 

-- 不推荐

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);



-- 推荐

SELECT * FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.id = table2.id);

 

  1. 使用JOIN代替子查询

 

在查询中使用JOIN可以更好地表达查询的逻辑,避免使用复杂的子查询。

 

-- 不推荐

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);



-- 推荐

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

 

第五部分:LIMIT优化

 

  1. 使用LIMIT限制返回的记录数

 

在查询大量数据时,使用LIMIT可以限制返回的记录数,避免查询过多的数据。

 

-- 返回前10条记录

SELECT * FROM table_name LIMIT 10;

 

  1. 使用分页查询

 

在查询分页数据时,可以使用LIMIT结合OFFSET实现分页查询。

 

-- 返回第1页的数据,每页10条记录

SELECT * FROM table_name LIMIT 0, 10;



-- 返回第2页的数据,每页10条记录

SELECT * FROM table_name LIMIT 10, 10;

 

第六部分:排序优化

 

  1. 使用合适的排序字段

 

在排序查询时,选择合适的排序字段可以减少排序的时间和开销。

 

  1. 使用合适的排序字段

 

在排序查询时,选择合适的排序字段可以减少排序的时间和开销。通常应该选择已经建立了索引的字段进行排序,避免对大量数据进行排序操作。

 

-- 不推荐

SELECT * FROM table_name ORDER BY name;



-- 推荐

SELECT * FROM table_name ORDER BY indexed_column;

 

  1. 使用覆盖索引减少排序

 

如果查询中只需要排序字段,并且该字段已经建立了索引,可以使用覆盖索引来减少排序的时间。

 

-- 创建索引

CREATE INDEX idx_name ON table_name(name);



-- 使用覆盖索引

SELECT name FROM table_name ORDER BY name;

 

  1. 使用DESC进行降序排序

 

在进行降序排序时,使用DESC关键字可以明确排序方式,避免不必要的排序操作。

 

-- 降序排序

SELECT * FROM table_name ORDER BY column_name DESC;

 

第七部分:避免使用通配符

 

  1. 避免使用%通配符

 

在查询数据时,尽量避免使用%通配符在查询字段的开头,这会导致索引失效,需要进行全表扫描。

 

-- 不推荐

SELECT * FROM table_name WHERE column_name LIKE '%value';



-- 推荐

SELECT * FROM table_name WHERE column_name LIKE 'value%';

 

  1. 使用前缀索引

 

如果需要在查询中使用通配符%在字段的结尾,可以使用前缀索引来优化查询性能。

 

-- 创建前缀索引

CREATE INDEX idx_column ON table_name(column_name(10));



-- 使用前缀索引

SELECT * FROM table_name WHERE column_name LIKE 'value%';

 

第八部分:联合查询优化

 

  1. 使用UNION ALL代替UNION

 

在使用联合查询时,如果不需要去重操作,应该使用UNION ALL,可以减少查询的开销。

 

-- 不推荐

SELECT * FROM table1 WHERE condition

UNION

SELECT * FROM table2 WHERE condition;



-- 推荐

SELECT * FROM table1 WHERE condition

UNION ALL

SELECT * FROM table2 WHERE condition;

 

  1. 使用EXISTS代替IN和UNION

 

在查询中使用EXISTS代替IN和UNION,可以更好地表达查询逻辑,提高查询性能。

 

-- 不推荐

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2 WHERE condition)

UNION

SELECT * FROM table1 WHERE id IN (SELECT id FROM table3 WHERE condition);



-- 推荐

SELECT * FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.id = table2.id AND condition)

OR EXISTS (SELECT 1 FROM table3 WHERE table1.id = table3.id AND condition);

 

第九部分:使用子查询优化

 

  1. 使用内连接代替子查询

 

在使用子查询时,尽量使用内连接代替,可以减少查询的开销。

 

-- 不推荐

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);



-- 推荐

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

 

  1. 使用EXISTS代替IN

 

在使用子查询时,尽量使用EXISTS代替IN,EXISTS只关心是否存在记录,而IN会将子查询的结果集加载到内存中,可能导致性能问题。

 

-- 不推荐

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);



-- 推荐

SELECT * FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.id = table2.id);

 

第十部分:数据表设计优化

 

  1. 使用合适的数据类型

 

在创建数据表时,选择合适的数据类型可以减少存储空间和查询时间,提高数据库性能。

 

-- 不推荐

CREATE TABLE table_name (id VARCHAR(100), name VARCHAR(100));



-- 推荐

CREATE TABLE table_name (id INT, name VARCHAR(100));

 

  1. 垂直拆分表

 

在数据表中包含大量冗余数据时,可以考虑对表进行垂直拆分,将不同的数据拆分到不同的表中,提高查询性能。

 

第十一部分:其他优化方法

 

  1. 使用连接池

 

使用连接池可以减少连接数据库的开销,提高数据库的并发性能。

 

  1. 合理配置缓冲区

 

根据数据库的实际情况,合理配置缓冲区大小,加快数据的读写速度。

 

  1. 使用延迟关联

 

在进行关联查询时,可以考虑使用延迟关联,将关联查询放在最后执行,减少关联操作的次数。

 

  1. 避免使用临时表

 

在查询中尽量避免使用临时表,临时表会增加查询的开销。

 

  1. 定期优化数据表

 

定期对数据表进行优化,包括重新建立索引、压缩表等操作,可以提高数据库的性能。

 

结语

 

本文介绍了常用的30种MySQL SQL查询优化方法,并通过实际案例演示了它们的应用。优化SQL查询是提高数据库性能和响应速度的关键,通过合理优化SQL查询可以减少数据库的负载,提高查询效率。读者可以根据自己的实际情况和业务需求,选择合适的优化方法,提高数据库的性能和可用性。同时,我们也要不断学习和实践,在数据库领域不断提高自己的知识水平和技术能力,成为一名优秀的数据库工程师。

 

收录于合集 #数据库
 4
上一篇搭建:Mycat 读写分离数据库分库分表中间件及简单使用
阅读 354
good7ob
 
 
关注后可发消息
 
 
posted @ 2023-08-22 11:08  往事已成昨天  阅读(67)  评论(0编辑  收藏  举报