`
jedy
  • 浏览: 152231 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

使用延迟的join来优化count(*)和limit语句(翻译)

阅读更多

在很多运用中,常有这样的结构,一个主表和一个附加表,附加表用来存一些附加信息,取数据的时候需要和主表连接。



如果你在这样的结构上执行count(*),那么即使使用了left join,MySQL仍然会做连接。同样的如果使用了limit,MySQL也会连接一些最终会扔掉的行。当limit的偏移量很大的时候,这样的连接是很浪费时间的。



对于这样的情况,你可以帮助MySQL不要对count(*)做连接或者做了limit之后再连接。



请看下面的例子:


1 CREATE TABLE `fact` (
2 `i` int(10) UNSIGNED NOT NULL,
3 `val` int(10) UNSIGNED NOT NULL,
4 KEY `i` (`i`,`val`)
5 )
6
7 CREATE TABLE `dim` (
8 `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
9 `pad` varchar(100) NOT NULL,
10 PRIMARY KEY (`id`)
11 )
12
13 mysql> SELECT count(*) FROM dim;
14 +----------+
15 | count(*) |
16 +----------+
17 | 30720 |
18 +----------+
19 1 row IN SET (0.00 sec)
20
21 mysql> SELECT count(*) FROM fact;
22 +----------+
23 | count(*) |
24 +----------+
25 | 7340032 |
26 +----------+
27 1 row IN SET (0.00 sec)
28
29 mysql> SELECT count(*) FROM fact WHERE i<10000;
30 +----------+
31 | count(*) |
32 +----------+
33 | 733444 |
34 +----------+
35 1 row IN SET (0.44 sec)
36
37
38 mysql> SELECT count(*) FROM fact LEFT JOIN dim ON val=id WHERE i<10000;
39 +----------+
40 | count(*) |
41 +----------+
42 | 733444 |
43 +----------+
44 1 row IN SET (2.15 sec)
45
46
47 mysql> SELECT i,pad FROM fact LEFT JOIN dim ON val=id WHERE i<10000 LIMIT 500000,10;
48 +------+------------------------------------------+
49 | i | pad |
50 +------+------------------------------------------+
51 | 6811 | 06bfea523be29a6070488ee66e874dffa170de76 |
52 | 6811 | 3baf40c2d76998270f8954bedda386b5021e0624 |
53 | 6811 | 35ad5c3a9d0763acc305992327864bed1af34167 |
54 | 6811 | 81de98a3ef74ddc0fa4f7c95a27e3dbebca8df0d |
55 | 6811 | 11cde5d0bd8ffe1eda86b39d05a58c525e8fac8f |
56 | 6811 | 25c474b380388c23b1de730c4255612e1233e14e |
57 | 6811 | 1d32b5ba28a513097fc88f3efd91155b2697aeec |
58 | 6811 | bdc9a39cdfafda26fc2f48a48abd3bc5f051a4ea |
59 | 6811 | d2e6cb9ca5aa9dd2bc3d033de45579a76ccdafdf |
60 | 6811 | 0130c708083d77377255bd8f5e0daa15fbb24212 |
61 +------+------------------------------------------+
62 10 rows IN SET (3.88 sec)
63
64 mysql> SELECT i,pad FROM (SELECT i,val FROM fact WHERE i<10000 LIMIT 500000,10) res LEFT JOIN dim ON val=id;
65 +------+------------------------------------------+
66 | i | pad |
67 +------+------------------------------------------+
68 | 6811 | 06bfea523be29a6070488ee66e874dffa170de76 |
69 | 6811 | 3baf40c2d76998270f8954bedda386b5021e0624 |
70 | 6811 | 35ad5c3a9d0763acc305992327864bed1af34167 |
71 | 6811 | 81de98a3ef74ddc0fa4f7c95a27e3dbebca8df0d |
72 | 6811 | 11cde5d0bd8ffe1eda86b39d05a58c525e8fac8f |
73 | 6811 | 25c474b380388c23b1de730c4255612e1233e14e |
74 | 6811 | 1d32b5ba28a513097fc88f3efd91155b2697aeec |
75 | 6811 | bdc9a39cdfafda26fc2f48a48abd3bc5f051a4ea |
76 | 6811 | d2e6cb9ca5aa9dd2bc3d033de45579a76ccdafdf |
77 | 6811 | 0130c708083d77377255bd8f5e0daa15fbb24212 |
78 +------+------------------------------------------+
79 10 rows IN SET (0.30 sec)

可以看到使用的小技巧改善了速度。

分享到:
评论

相关推荐

    SQL 语句 帮助文档

    - **联接(JOIN)**:用于合并两个或多个表的数据,如INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN。 - **子查询**:嵌套在其他查询中的查询,用于提供数据或满足特定条件。 - **集合操作**:UNION、...

    大数据开发+hive优化方法大全+hql优化

    针对Hive的性能优化,可以从多个方面进行,包括SQL语句优化、数据格式优化、小文件过多优化、并行执行优化、数据倾斜优化以及LIMIT限制调整等。以下是这些优化方法的详细说明: 1. **SQL语句优化** - **union all...

    SQL查询语句的练习

    SELECT语句的结构包括选择列、从哪个表中选择、如何连接多个表(JOIN)、筛选条件(WHERE子句)、分组(GROUP BY子句)、排序(ORDER BY子句)和限制返回行数(LIMIT子句)等。 - 例如:`SELECT column1, column2 ...

    SQL语法大全,标准语法,各种sql概念的解释,常用语句的使用

    此外,还可以使用ORDER BY进行排序,LIMIT或OFFSET来限制返回的结果数量。 3. **INSERT语句** INSERT语句用于向表中插入新的记录。你可以一次性插入一条或多条记录,具体取决于提供的值列表。 4. **UPDATE语句** ...

    SQL优化原则

    - **优化查询方式**:选择更为高效的数据获取方式,如使用索引覆盖而非全表扫描,利用JOIN语句替代子查询等技术手段,可以显著提高查询效率。 - **合理使用SELECT语句**:避免使用`SELECT * FROM table`这样的...

    mysql查询语句汇总

    - **SELECT语句**: 用于从表中选择数据。基本格式为 `SELECT column1, column2... FROM table_name;` - **WHERE子句**: 用于过滤结果,例如 `SELECT * FROM table WHERE condition;` - **LIKE操作符**: 用于模式...

    SQL语句 语法 经典课件

    9. **SQL性能优化**:包括合理设计索引、避免全表扫描、使用EXPLAIN分析查询计划、减少JOIN操作等策略。 10. **SQL安全性**:用户权限管理、视图和存储过程的使用、加密和审计功能等都是保证SQL数据库安全的重要...

    MySQL查询语句汇总.zip

    1. **SELECT语句**:这是最基础也是最常用的查询语句,用于从一个或多个表中选取特定列的数据。例如,`SELECT column1, column2 FROM table_name;` 将返回指定列的数据。 2. **WHERE子句**:WHERE用于过滤结果集,...

    SQL查询语句应用

    - 在MySQL和某些数据库系统中,可以使用LIMIT关键字进行分页,如 `SELECT * FROM table_name LIMIT offset, limit_count;` 8. **别名 (AS)** - 给表或列赋予别名,使得查询语句更易读,如 `SELECT column_name AS...

    SQL语法优化大全

    6. **ORDER BY与LIMIT**:排序操作代价高,尽量减少ORDER BY的使用,或者利用索引来优化排序。LIMIT用于限制返回结果的数量,能有效降低网络传输和内存消耗。 7. **存储过程与函数**:创建和调用存储过程可以减少...

    简单实用的SQL语句大全

    - **视图**:创建虚拟表,基于一个或多个表的查询结果,方便重复使用和简化复杂查询。 - **索引**:提高查询性能,可以创建在单个列或多列上的索引。 - **事务处理**:确保数据一致性,包括BEGIN、COMMIT、...

    如何写高效sql语句

    3. **优化JOIN操作** - 尽可能减少JOIN的数量,每个JOIN都会增加查询复杂性,影响性能。 - 确保JOIN条件使用的是索引字段,且类型匹配,避免隐式类型转换。 - 使用INNER JOIN代替OUTER JOIN,如果可能,因为INNER...

    SQL语句练习笔记/文件

    - **SELECT语句**:用于从数据库中检索数据,是最基本的SQL命令。可以指定列名、表名,甚至进行条件筛选。 - **FROM子句**:指定要从中检索数据的表。 - **WHERE子句**:定义检索数据的条件。 - **GROUP BY和...

    数据库SQl语句实验报告

    - **基本SELECT语句**:用于从表中选择数据,如获取班级名称、学院、年级等信息。 #### 二、条件筛选 - **WHERE子句**:用于设置查询条件,如筛选年龄大于特定值的学生。 - **IN操作符**:用于匹配一个列表中的值,...

    sql 精华语句..............

    以上仅是SQL语句的一部分精华内容,实际应用中还有更多高级特性,如窗口函数、JOIN优化、子查询优化等。熟练掌握这些语句将极大地提高你在数据库管理、数据分析和应用开发中的能力。通过不断实践和学习,你将成为SQL...

    经典SQL语句大全经典SQL语句大全

    - **UPDATE语句**:用于更新现有数据行,通常与WHERE子句结合使用,只更新满足特定条件的记录。 - **DELETE语句**:用于删除表中的数据行,可以是全部数据,也可以是满足特定条件的数据。 2. **JOIN操作**:...

    mysql查询语句汇总.rar

    MySQL是一种广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于学习的特点,成为了开发者们首选的数据库解决方案之一。本资料“mysql查询语句汇总.rar”包含了一份关于MySQL查询语句的详细文档“mysql查询...

    T--Sql流程控制语句练习,和数据库练习题

    4. **跳转语句**:如`GOTO`,可以跳转到程序中的任意标签,但不推荐使用,因为容易导致代码难以理解和维护。 其次,**数据库练习题**通常涉及以下几个方面: 1. **查询操作**:包括基本的SELECT语句,子查询,联接...

    有关MySQL数据库与标准的兼容性问题 电脑资料.docx

    MySQL数据库是一种广泛使用的开源关系型数据库管理系统,它在遵循SQL标准的同时,也包含了一系列特有的语法扩展和优化,这些特性使得MySQL在某些方面与其他SQL数据库有所不同。以下是对标题和描述中涉及的一些MySQL...

    练习使用mysql查询语句 50题.zip

    13. **索引**: 学习如何创建、使用和优化索引,提高查询性能。 14. **事务处理**: 了解如何使用BEGIN, COMMIT, ROLLBACK来管理数据库事务,确保数据一致性。 15. **存储过程与函数**: 定义可重复使用的操作序列,...

Global site tag (gtag.js) - Google Analytics