那个mysql 子查询和连接查询 一般常用哪个 谁效率高些

我记得上次我帮助同事调试报告查询速度慢的问题。
它的 IN 子查询降低了整个数据库的速度。
当时我一眼就看出IN子查询表非常大,优化器实际上使用的是semijoinMaterialization。
现在表里有一百万条数据,全部提取出来和外界做笛卡尔积,直接烧毁CPU。
后来我升级到Exist,瞬间快了十倍。
就在昨天,我遇到了另一个NOTIN。
这次,优化器使用物化将子查询结果存储在临时表中,然后在外部进行关联。
嘿,这实际上比实际速度要快。
但有一个奇怪的事情。
我之前尝试过派生表,但优化器坚持使用衍生_合并并拆分整个子查询。
结果外面有JOIN,但是慢得离谱。
等等,还有一件事。
我在PostgreSQL 1 2 上测试了NOTIN的具体化,临时表的大小其实控制得很好,大约5 万条数据。
但如果是MySQL,会不会爆炸呢?

mysql 表 删除数据

哈,我用的是你之前经常提到的那些MySQL数据删除方法。
上周有客户问我,他们公司的数据库里数据太多了,不知道如何快速清除。
我向他解释了这两种方法。

首先,如果要删除表中的所有数据,同时保留表结构和索引,使用DELETE FROM是非常方便的。
只需编写 DELETE FROM table_name; 即可。
此操作将从表中删除所有记录,但表本身仍然存在。

但是,如果您想更有效地清除数据并重置自增计数器,那么使用 TRUNCATE TABLE 是一个很好的解决方案。
写入 TRUNCATE TABLE 表名;像这样;这比 DELETE 快得多,因为 TRUNCATE 不保存每个删除行的日志。

说到差异,TRUNCATE比DELETE更快,因为它不保存日志并重置自增列的计数器,但DELETE不会这样做。
但是,TRUNCATE 无法撤消,但 DELETE 可以。

然后,如果要删除满足特定条件的数据,请在 DELETE 后面加上 WHERE 子句。
例如,要删除某个值,请编写 DELETE FROM table_name WHERE column_name = 'value';。
如果要同时满足多个条件,请使用 AND 或 OR。

再比如,有时需要根据另一个表的数据删除数据。
在这种情况下,您可以使用子查询。
像这样 DELETE FROM table_name WHERE column_name IN (SELECT column_name FROM other_table WHERE other_column = 'value');就是在other_table中找到匹配的值,然后在主表中删除匹配的记录。

但是,请注意,在使用子查询时,这可能会影响性能,尤其是在处理大量数据时。

最后,使用前最好保存数据,以免误操作。
另外不要忘记使用事务来控制它,这样如果出现问题你可以回滚。
此外,执行删除操作的用户必须具有足够的权限。
无论哪种方式,都取决于你。
这些操作都是比较基础的,应该不会造成任何问题。
我总是想知道你们公司的数据库里有多少数据?如果它很大,子查询可能会很慢。