MySQL中如何执行SQL语句?

我上周尝试了独立版的wow。

需要 MySQL。

我的朋友使用 Navicat。

他说演起来很容易。

但后来他改变了安装版本。

因为有很多场景。

手动执行非常费力。

算了。

这取决于你。

MySQL的一行转换为多行技巧mysql一行变成多行

2 02 3 年,我的朋友正在开发一个项目,需要将用户表中的兴趣列拆分为多行数据。
他使用了两种方法,UNIONALL和GROUPBY。

上周,他使用UNIONALL写了一个复杂的SQL语句,使用了SUBSTRING_INDEX和JOIN,效果相当不错。
例如:
选择 ID、兴趣 来自( SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(首选项, ',', n.digit+1 ), ',', -1 ) 首选项 来自用户 加入( 选择 0 位数字 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) n ON LENGTH(REPLACE(首选项, ',', '')) = n.digit ) t
然后他想尝试使用 GROUPBY,结果成功了。
他写道:
插入 new_orders(order_id, item) SELECT order_id, SUBSTRING_INDEX(SUBSTRING_INDEX(items, ',', n.digit+1 ), ',', -1 ) 商品 来自( SELECT order_id,订单中的商品 ) t 加入( 选择 0 位数字 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) n ON LENGTH(REPLACE(items, ',', '')) = n.digit 物品在哪里!= '' 按订单 ID、商品分组
两种方法都用了,挺有意思的。
由您决定哪种方法更适合您的需求。

MySQl执行SQL过程示例

等等,还有一件事。
昨天我在调试一个慢速的SQL查询,我花了很长时间才发现问题出在索引上。
t1 表有千万级数据。
我使用的t1 _1 (a,c)索引实际上在a列中具有较高的选择性,在c列中具有平均选择性,但查询条件是a='1 '和c!=4 导致索引扫描效率不高,返回c列很多不需要的数据。
最后,过滤结果集的速度减半。

我突然想到了子查询重写部分。
我之前使用的示例是原始查询是 select from t1 where a in (select a from t2 where b='3 ')。
到时候直接改写为连接查询会更快,因为t2 表很小,可以用临时表来优化。
但这种优化并不是万能的。
在一个项目中,修改后变得更慢。
原因是表t2 的数据量突然增加到几十万行。

在索引扫描期间,我会查看 MySQL 将确定使用全表扫描是否更具成本效益的详细信息。
例如,a 列的选择性为 9 0%,c!=4 过滤掉 1 0% 的数据。
理论上来说,索引扫描应该比全表扫描快。
但实际测试发现,当c列过滤数据的比例也很高时,MySQL实际上是采用全表扫描+单列索引,最终比索引扫描更快。
这让我想起2 02 1 年3 月在杭州培训时老师给我讲的一个案例,表数据量2 00万条,索引扫描实际上比全表扫描慢了3 0%。

等一下,还有一个现象:谓词插值并不总是成功。
我见过最初说从存在的 t1 中选择 id 的查询(从 t2 中选择 1 ,其中 t1 .id=t2 .id 和 t2 .status='active')。
重写为谓词插值后,SQL执行计划中添加了一个额外的步骤“创建子查询”。
结果,查询时间从2 秒跃升至1 5 秒。
当时查了手册,发现是因为t2 表中有一个触发器正在更新状态列,导致内推失败。

现在问题来了,存储引擎向SQL引擎返回数据时,应该逐行返回还是批量返回?我还没有看到官方文档对此进行详细说明,并且不同的存储引擎实现可能有所不同。
比如InnoDB是按页返回,但是MyISAM好像是按行返回?这些细节会影响SQL层合并结果集的效率吗?