今天有位同学出来一个趣味小题。 A: select title from simplified where id in (select id from analysis where word = something); B: select b.title from analysis a join simplified b on (a.id=b.id) where a.word=something; C: select simplified
今天有位同学出来一个趣味小题。
A:
select title
from simplified
where id in (select id
from analysis
where word = ‘something’);
B:
select b.title
from analysis a
join simplified b
on (a.id=b.id)
where a.word=’something’;
C:
select simplified.title
from analysis
join simplified
on (analysis.id=simplified.id)
where analysi.word=’something’;
上面的3段sql,在MYSQL中执行,哪一个效率最优,请讲出原因
看到这个问题,我想起了之前作面试官的时候,也问过这里的问题。从另一个角度,我收集了大家面对这题目的时候一些思考,总结成下面的一个面试小故事。
这类题目真得蛮适合面试的时候考察对sql的掌握程度。
模拟一个场景,面试者:小白,面试官:小二,下面开始这段面试过程…..
小二:…. 我这里有个小问题,你看看(给出上面3段sql),balabala。。。。
小白:这2个表数据量如何了,join ,子查询的优化根据数据量可能还有所不一样吧。子查询适合外结果集大,子查询结果集小的情况,最好是能保证子查询所返回的结果集尽量的小。
小二:假设2表,数据量差不多,都是万条记录左右。
小白:如果是这种的话,A应该会慢一点吧。 如果是在mysql上执行的话,A中子查询语句会认为与外面的simolified表进行关联比较有效率。这样的话A其实就回被翻译成:
select title from simplified where exists (select simplified.title from analysis where word= ‘something’ and id =simplified .id);
这种in子查询的形式,在外部表(比如上面的simplified )数据量较大的时候效率是很差的.
小二: 恩,那么B和C之间有什么区别呢?
小白:B和C在我看来,应该是差不多的,其主要区别就是B采用了别名。但是我认为应该是没多大影响的。
因为数据库本身执行时,都会再把表名给换成自己的别名。但我影响中好像记得有一条数据库的优化建议是尽量多表连接,最好是使用表的别名来引用列。
对了,有对id建索引吧。
小二: 2表id都是主键,这算是建了索引吗?
小白: 是的,主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。
小二: 恩,一张表只能有一个主键,是不是就可以说只能有一个唯一的索引呢?
小白: 不对,主键一定是唯一性索引,唯一性索引并不一定就是主键,主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。
小二: 主键列和唯一索引列还有区别吗?
小白:应该有,我知道的主键列不允许空值,而唯一性索引列允许空值。一个表中可以有多个唯一性索引,但只能有一个主键。
小二: 恩,回到上面的问题,你记得多表连接,最好使用表的别名来引用列,哪你有想过会是什么原因导致的呢?
小白:我估计应该是Mysql内部处理逻辑有关吧,有可能是使用了别名,就会再建一个临时表放入内存,这样后面的命中会更高。
小二: 差不多吧,mysql引擎自动生成temp表,造成缓存的效果。从这个sql,你大致应该能明白它的意图了,你想想有没有更优的写法,可以试试看…
小白: 好的,我想想…..
小白:
select b.title from
(select id from analysis where word=’something’)a,
simplified b
where a.id=b.id;
如果这么去写,应该是最快的。放弃子查询和join。
小二: 恩,不错…..
。。。。。。
如果我在面试中碰到这样的小白,绝对会留下深刻的影响。
原文地址:关于子查询和连接的趣味小题目, 感谢原作者分享。

ACID属性包括原子性、一致性、隔离性和持久性,是数据库设计的基石。1.原子性确保事务要么完全成功,要么完全失败。2.一致性保证数据库在事务前后保持一致状态。3.隔离性确保事务之间互不干扰。4.持久性确保事务提交后数据永久保存。

MySQL既是数据库管理系统(DBMS),也与编程语言紧密相关。1)作为DBMS,MySQL用于存储、组织和检索数据,优化索引可提高查询性能。2)通过SQL与编程语言结合,嵌入在如Python中,使用ORM工具如SQLAlchemy可简化操作。3)性能优化包括索引、查询、缓存、分库分表和事务管理。

MySQL使用SQL命令管理数据。1.基本命令包括SELECT、INSERT、UPDATE和DELETE。2.高级用法涉及JOIN、子查询和聚合函数。3.常见错误有语法、逻辑和性能问题。4.优化技巧包括使用索引、避免SELECT*和使用LIMIT。

MySQL是一种高效的关系型数据库管理系统,适用于存储和管理数据。其优势包括高性能查询、灵活的事务处理和丰富的数据类型。实际应用中,MySQL常用于电商平台、社交网络和内容管理系统,但需注意性能优化、数据安全和扩展性。

SQL和MySQL的关系是标准语言与具体实现的关系。1.SQL是用于管理和操作关系数据库的标准语言,允许进行数据的增、删、改、查。2.MySQL是一个具体的数据库管理系统,使用SQL作为其操作语言,并提供高效的数据存储和管理。

InnoDB使用redologs和undologs确保数据一致性和可靠性。1.redologs记录数据页修改,确保崩溃恢复和事务持久性。2.undologs记录数据原始值,支持事务回滚和MVCC。

EXPLAIN命令的关键指标包括type、key、rows和Extra。1)type反映查询的访问类型,值越高效率越高,如const优于ALL。2)key显示使用的索引,NULL表示无索引。3)rows预估扫描行数,影响查询性能。4)Extra提供额外信息,如Usingfilesort提示需要优化。

Usingtemporary在MySQL查询中表示需要创建临时表,常见于使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通过优化索引和重写查询避免其出现,提升查询性能。具体来说,Usingtemporary出现在EXPLAIN输出中时,意味着MySQL需要创建临时表来处理查询。这通常发生在以下情况:1)使用DISTINCT或GROUPBY时进行去重或分组;2)ORDERBY包含非索引列时进行排序;3)使用复杂的子查询或联接操作。优化方法包括:1)为ORDERBY和GROUPB


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Atom编辑器mac版下载
最流行的的开源编辑器