MySQL和PostgreSQL:如何优化查询执行计划?

简单来说,MySQL和PostgreSQL的查询计划优化就是利用EXPLAIN找到慢点,然后进行有针对性的调整。

MySQL优化方法 首先用EXPLAIN查看计划,注意表是如何读的,是否使用了索引,过滤条件是什么。
例如,EXPLAIN SELECT FROM clients WHEREage>3 0;如果发现没有使用最佳索引,直接使用FORCEINDEX强制调整,如EXPLAIN SELECT FROM customer FORCEINDEX(age_index) WHEREage>3 0;它会起作用的。
还有一点就是查询条件必须与索引匹配,索引不能因为数据类型转换或者函数操作而失效。
例如,SELECT FROM client WHERE YEAR(create_time)=2 02 3 ;这种写法会使索引失效。
需要改为 SELECT FROM customer WHERE create_time BETWEEN '2 02 3 -01 -01 ' AND '2 02 3 -1 2 -3 1 ';哪个更有效率。

PostgreSQL优化方法 PostgreSQL也使用EXPLAIN来查看计划,但是要特别注意过滤计划节点的顺序和条件。
例如,EXPLAIN SELECT FROM clients WHEREage>3 0;如果您想了解更多详细信息,请添加 ANALYZE 并运行它,例如 EXPLAIN ANALYZE SELECT FROM clients WHEREage > 3 0;这样就可以看到具体花费的时间。
还有一个更重要的细节。
您可以使用 pgTune 工具自动创建基于内存的优化配置。
例如,在具有 2 GB 内存的系统上,运行 SELECT FROM pgtune('2 GB');可以自动调整shared_buffers、work_mem等参数,减少磁盘I/O和内存争用。

思想的痕迹 一开始我以为PostgreSQL中的EXPLAIN和MySQL中的一样,后来发现它有一个ANALYZE函数,可以实际计算花费的时间,相当实用。
等等,还有一件事:pgTune 非常智能,但是在使用它之前您需要确认系统内存描述是否准确。

一般优化技巧 索引策略应该选择选择性高的列,并为选择性低的字段创建单独的索引。
选择性,例如性别。
复合索引必须遵循最左前缀原则。
例如索引(a,b)可以优化WHERE a=1 AND b=2 ,但是WHERE b=2 就不行了。
指数覆盖率良好。
这样可以确保查询所需的所有字段都设置在索引中,并减少表返回的次数。
例如,通过索引(年龄,姓名)可以优化 SELECT name FROMclients WHEREage>3 0;。
统计信息必须定期更新。
MySQL使用ANALYZE TABLE,PostgreSQL直接使用ANALYZE,这样优化器就可以根据最新的数据采取行动。

简易陷阱提醒 不要盲目地在 WHERE 子句中使用函数。
在我们去年运行的一个项目中,索引被禁用,因为 WHERE MONTH (create_time) = 3 验证级别 3 000 数据的速度慢了五倍。
说实话,这是很不愉快的。

结局 我感觉很多人都没有注意到这一点。
建议多次运行EXPLAIN,特别是对于复合索引和函数操作。

有什么工具可以可视化MYSQL执行计划

嗯...MySQL执行计划...需要用一个工具来查看...
MySQLWorkbench...很好...免费...直接在里面写SQL...然后点击它...运行...然后就有...执行计划...选项卡...点击它...可以看到...是一个图...树形...可以看到...什么是全表扫描...什么是索引扫描...那个...成本...IO成本...CPU成本...都...有...相当直观...可以还...导出...PNG...PDF...开发人员...易于使用...
还有一件事...pt-visual-explain...它是一个命令行...您需要...Linux或Mac...安装Percona Toolkit...然后...使用命令...mysql...那个...EXPLAIN...选择一个查询...然后通过管道...将其连接到pt-visual-explain...它...得到...一个...ASCII图形图表...参见...表格连接...或者其他...没有图形界面的服务器...可以吗...
QueryProfiler...这个...它是 MySQL 自带的...你需要运行它...命令...SETprofiling=1 ...然后...运行你的查询...然后...SHOWPROFILES...看看...每个阶段花费的时间...使用了多少 CPU...多少 I/O 时间...这个东西...适合...检查特定问题...比如...锁延迟...或者...旧的全表扫描...
最后...解释...这个...最简单...解释...或者... EXPLAINFORMAT=JSON...根据MySQL5 .6 ...有JSON格式...更多详细信息...有一个类型...ALL...索引...键...哪个索引...行...要检查多少行...额外...和...临时表...排序...这些信息...
你应该选择哪一个...取决于情况...日常开发...只需使用Workbench...远程服务器...或者编写一个脚本...只需pt-visual-explain...如果你想更详细地检查...资源使用情况...只需添加QueryProfiler...解释...看一下基础知识...只是解释...只是...

一文搞懂各种数据库SQL执行计划:MySQL、Oracle等

哎呀,说到这个SQL执行计划,这真是数据库中的一个难题。
你必须一点一点地做,先给出一个大概的轮廓。

首先,行动计划就像驾驶汽车;你需要知道去哪里,对吧?在 MySQL 中,只需在 SQL 之前添加 EXPLAIN 关键字即可获得一个表,告诉您 SQL 的运行情况。
比如我想先查哪张表,是使用索引还是全表扫描,如何进行连接查询等等,这些都在表里。

例如,在本例中我们有一个员工表。
首先,我们扫描整个表并处理 1 07 行数据。
然后我们使用 WHERE 条件对其进行过滤,留下大约 3 3 .3 3 % 的数据。
然后,它会转到 Department 表并使用主键索引来查找匹配的数据。

再比如,MySQL 8 .0还新增了一个ANALYZE选项,可以告诉你实际的执行时间等。

Oracle有多种方式查看执行计划,包括使用EXPLAINPLANFOR命令生成执行计划,然后将其存储在临时表中,以及使用DBMS_XPLAN格式化显示。

Oracle的执行计划包含几个关键信息:例如Planhashvalue,SQL中的哈希值; ID是序列号,但不是执行顺序。
一个操作,指示当前操作如何访问表数据、连接表、排序等。
名称是正在访问的表名称、索引名称或子查询。

SQL Server有图形化工具,但你还需要了解命令行方法。
例如,SETSTATISTICSPROFILEON可以启用语句分析,执行的SQL语句返回执行计划。

SQL Server的执行计划包含几个关键信息: 一行指示实际创建的记录数;运行次数 - 表示实际运行次数。
StmtText StmtId,包含每个步骤具体描述的语句编号。
PhysicalOp,物理操作,例如 join 操作的嵌套循环实现。
LogicalOp,即逻辑操作,例如内连接操作。

PostgreSQL 与 MySQL 一样,使用 EXPLAIN 关键字。
支持常见的SQL语句,如SELECT、INSERT、UPDATE和DELETE。

简单来说,这个执行计划告诉SQL应该如何进行以及每一步做什么。
为了优化您的 SQL 语句并使其运行得更快,您需要学习如何阅读和分析它们。

oracle 执行计划怎么看

啊兄弟,我在公司优化数据库的时候,我们的Oracle数据库遇到了问题。
我记得当时我们公司有一个大项目。
数据库的表如星星一样多,查询速度慢得像蜗牛一样。
那时我就​​开始研究如何优化这些查询。

当时我正在使用一个名为 AquaDataStudio 的工具,它非常有帮助。
首先,您需要安装Oracle数据库和AquaDataStudio并连接到数据库。
我很熟悉这个过程,因为我当时每天都与数据库打交道。

连接后,我在AquaDataStudio中创建了一个新的查询窗口,并输入了我想要分析的SQL语句。
例如,如果您想查看某个部门中所有员工的信息,则需要编写 SQL,例如 SELECT FROM员工 WHERE 部门 ID = 1 0
接下来,查找“执行计划”按钮。
看起来就像闪电。
点击它,AquaDataStudio自动生成一个执行计划。
我查看了一下,发现执行计划进行了全表扫描。
天哪,这不可能。
表中的数据量非常大。
扫描全表需要多长时间?
仔细观察,发现Department_id列上没有创建索引。
难怪查询速度很慢。
我立即创建了索引,并使用 CREATE INDEX idx_name ON table_name(column_name) 命令在 AquaDataStudio 中重新运行 SQL 语句。
我发现执行计划没有全表扫描,查询速度快了很多。

要优化这个问题,应该定期收集统计信息,并使用 ANALYZE TABLE table_name COMPUTE STATISTICS 等命令来帮助优化器根据准确的数据生成执行计划。

我在这方面有相当多的经验,顺便说一句,我当时也尝试过使用 SQL 提示(Hints)来指导优化器,比如添加 /+ORDERED/ 或 /+INDEX(table_nameindex_name)/ 以便优化器按照期望的顺序处理表。

简而言之,优化数据库查询是一项技术任务,必须缓慢、渐进地完成。
我在这个领域有相当多的经验。
如果您有任何具体问题,请随时与我们联系。