mysql优化
博客专区 > ericSM 的博客 > 博客详情
mysql优化
ericSM 发表于1年前
mysql优化
  • 发表于 1年前
  • 阅读 22
  • 收藏 5
  • 点赞 0
  • 评论 0

一 查询的逻辑执行顺序

FROM < left_table>

< join_type>  JOIN < right_table>   ON < join_condition>

WHERE < where_condition>

GROUP BY < group_by_list>

WITH {cube | rollup}

HAVING < having_condition>

SELECT   DISTINCT < top_specification>  < select_list>

ORDER BY < order_by_list>

LIMIT <offset> <length>

二 执行顺序

1.FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1

2.ON:对vt1表应用ON筛选器只有满足< join_condition> 为真的行才被插入vt2

3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束

4.WHERE:对vt3应用 WHERE 筛选器只有使< where_condition> 为true的行才被插入vt4

5.GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5

6.CUBE|ROLLUP:把超组(supergroups)插入vt6 生成vt6

7.HAVING:对vt6应用HAVING筛选器只有使< having_condition> 为true的组才插入vt7

8.SELECT:处理select列表产生vt8

9.DISTINCT:将重复的行从vt8中去除产生vt9

10.ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10

11.LIMIT:从vc10的开始处选择指定位置,指定数量的行生成vt11 并返回调用者

性能与团队开发必守规范

1.不要写SELECT * 的语句,而是选择你需要的字段

2.连接多表时, 每个Column上使用表的别名.就可以减少解析的时间并减少那些由Column歧义引起的语法错误和方便团队维护。

如有表table1(ID,col1)和table2 (ID,col2)

Select A.ID, A.col1, B.col2

— Select A.ID, col1, col2 –不要这么写,不利于将来程序扩展

from table1 A inner join table2 B on A.ID=B.ID Where …

3.合理写WHERE子句,不要写没有WHERE的SQL语句,

 正在显示第 0 - 24 行 (共 11755 行, 查询花费 0.0002 秒。)

SELECT * FROM `ent_****_datacenter_field_metadata` WHERE 1

稳定,速度快

4.NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法

 

 

标签: mysql优化
共有 人打赏支持
粉丝 14
博文 110
码字总数 87710
×
ericSM
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: