天道酬勤,学无止境

WHERE-CASE 子句子查询性能(WHERE-CASE clause Subquery Performance)

问题

该问题可能特定于 SQL 服务器。 当我编写查询时,例如:

SELECT * FROM IndustryData WHERE Date='20131231'
AND ReportTypeID = CASE WHEN (fnQuarterDate('20131231')='20131231') THEN  1 
                        WHEN (fnQuarterDate('20131231')!='20131231') THEN  4
                        END;

是否为表的每一行执行 Where 子句中 Case 内的函数调用 fnQuarterDate(或任何子查询)?

如果我事先在一个变量中获取函数的(或任何子查询)值会更好:

DECLARE @X INT
IF fnQuarterDate('20131231')='20131231'
SET @X=1 
ELSE
SET @X=0
SELECT * FROM IndustryData WHERE Date='20131231'
AND ReportTypeID = CASE WHEN (@X = 1) THEN  1 
                        WHEN (@X = 0) THEN  4
                        END;

我知道在 MySQL 中,如果 WHERE 子句中的 IN(..) 中有一个子查询,它会为每一行执行,我只是想为 SQL SERVER 找出相同的内容。

...

刚刚填充了大约 30K 行的表并找出了时差:

查询 1= 70 毫秒; 查询 2 = 6ms。 我认为这可以解释它,但仍然不知道其背后的实际事实。

如果不是 UDF 而是一个简单的子查询,也会有什么区别吗?

回答1

我认为该解决方案理论上可能会帮助您提高性能,但这也取决于标量函数的实际作用。 我认为在这种情况下(我的猜测是将日期格式化为本季度的最后一天)真的可以忽略不计。

您可能希望阅读此页面并提供建议的解决方法:

http://connect.microsoft.com/SQLServer/feedback/details/273443/the-scalar-expression-function-would-speed-performance-while-keeping-the-benefits-of-functions#

因为 SQL Server 必须在每一行上执行每个函数,所以使用任何函数都会导致像性能损失一样的游标。

在解决方法中,有一条评论说

当我在连接列中使用标量 UDF 时,我遇到了同样的问题,性能很糟糕。 在我用包含 UDF 结果的临时表替换 UDF 并在 join 子句中使用它后,性能好几个数量级。 MS 团队应该修复 UDF 以使其更可靠。

所以看起来是的,这可能会提高性能。

您的解决方案是正确的,但我建议考虑改进 SQL 以使用 ELSE,它对我来说看起来更清晰:

AND ReportTypeID = CASE WHEN (@X = 1) THEN  1 
                    ELSE 4
                    END;
回答2

这取决于。 请参阅用户定义的函数:

查询中指定的函数实际执行的次数可能因优化器构建的执行计划而异。 一个例子是由 WHERE 子句中的子查询调用的函数。 子查询及其函数的执行次数可能因优化器选择的不同访问路径而异。

回答3

这种方法使用内联 MySQL 变量...“sqlvars”的查询别名将首先使用相关日期准备 @dateBasis,然后是第二个变量 @qtrReportType 基于对整个查询完成一次的函数调用。 然后,通过交叉连接(通过表之间没有 where 子句,因为无论如何 sqlvars 被视为单行),将使用这些值从您的 IndustryData 表中获取数据。

select
      ID.*
   from
      ( select 
              @dateBasis := '20131231',
              @qtrReportType := case when fnQuarterDate(@dateBasis) = @dateBasis 
                                then 1 else 4 end ) sqlvars,
      IndustryData ID
   where
          ID.Date = @dateBasis
      AND ID.ReportTypeID = @qtrReportType

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • WHERE-CASE clause Subquery Performance
    The question can be specific to SQL server. When I write a query such as : SELECT * FROM IndustryData WHERE Date='20131231' AND ReportTypeID = CASE WHEN (fnQuarterDate('20131231')='20131231') THEN 1 WHEN (fnQuarterDate('20131231')!='20131231') THEN 4 END; Does the Function Call fnQuarterDate (or any Subquery) within Case inside a Where clause is executed for EACH row of the table ? How would it be better if I get the function's (or any subquery) value beforehand inside a variable like: DECLARE @X INT IF fnQuarterDate('20131231')='20131231' SET @X=1 ELSE SET @X=0 SELECT * FROM IndustryData
  • 子查询中是否允许order by子句(Is order by clause allowed in a subquery)
    问题 是否有任何原因为什么或为什么不应该在子查询中执行“排序依据”? 回答1 是:不应这样做,因为从概念上讲这没有意义。 子查询将在某些外部查询中使用(否则它将毫无意义),并且该外部查询无论如何都必须进行排序,因此对子查询进行排序没有任何意义。 这是因为除非使用显式ORDER,否则SQL中的查询结果将没有特定的顺序。 因此,即使您在子查询中使用了ORDER,也无法保证这会影响外部查询的结果顺序。 所以这是没有意义的。 当然,由于它的实现,它可能会在某些特定的RDBMS中有所作为,但这将是特定于实现的,而不是您应依赖的。 编辑:当然,如果在子查询中使用TOP或LIMIT,则需要使用ORDER。 但这毕竟不是标准的SQL ... 回答2 如果子查询使用某种LIMIT / TOP则应使用它。 除非子查询还包含TOP或FOR XML子句,否则SQL Server将不允许它: -- Fails WITH q(id) AS ( SELECT 1 UNION ALL SELECT 2 ) SELECT * FROM ( SELECT * FROM q ORDER BY id DESC ) q2 -- Succeeds WITH q(id) AS ( SELECT 1 UNION ALL SELECT 2 ) SELECT * FROM ( SELECT TOP 1 * FROM q ORDER
  • 什么时候应该在内部联接上使用交叉应用?(When should I use cross apply over inner join?)
    问题 使用CROSS APPLY的主要目的是什么? 我已经读过(模糊地通过Internet上的帖子),如果您正在分区,则在选择大型数据集时, cross apply可能会更有效。 (想起分页) 我也知道, CROSS APPLY不需要UDF作为右表。 在大多数INNER JOIN查询(一对多关系)中,我可以重写它们以使用CROSS APPLY ,但是它们总是给我等效的执行计划。 在CROSS APPLY在INNER JOIN也将起作用的情况下, CROSS APPLY时,谁能给我一个很好的例子? 编辑: 这是一个简单的示例,其中执行计划完全相同。 (向我展示它们的不同之处和cross apply的更快/更有效的地方) create table Company ( companyId int identity(1,1) , companyName varchar(100) , zipcode varchar(10) , constraint PK_Company primary key (companyId) ) GO create table Person ( personId int identity(1,1) , personName varchar(100) , companyId int , constraint FK_Person_CompanyId foreign
  • 带有子查询的PostgreSQL IN运算符性能较差(PostgreSQL IN operator with subquery poor performance)
    问题 与子查询一起使用时,为什么“ IN”运算符这么慢? select * from view1 where id in (1,2,3,4,5,6,7,8,9,10) order by somedata; 在9毫秒内执行。 select * from view1 where id in (select ext_id from aggregate_table order by somedata limit 10) order by somedata; 在25000毫秒内执行,似乎在视图( view1 )上使用顺序扫描,而不是像在第一次查询中那样,对子查询返回的主键进行索引扫描。 子查询select ext_id from aggregate_table order by somedata limit 10在0.1ms内执行 因此第二个查询的速度慢是由对view1的顺序扫描引起的,该视图是一个包含三个UNIONS和每个UNION中大约三个JOINS的视图。 第一个UNION包含约100万行,其他则少得多。 与具有约10万行的表联接。 不过,这并不是很重要,我只是想了解IN运算符的行为。 我要完成的工作是获取子查询(一组主键)的结果,并仅使用它们从复杂的视图( view1 )中选择数据。 我也不能使用 select v1.* from view1 v1, aggregate_table
  • MySQL:FROM子句限制中的带有子查询的视图(MySQL: View with Subquery in the FROM Clause Limitation)
    问题 在MySQL 5.0中,尝试在FROM子句中创建带有子查询的视图时,为什么会发生以下错误? 错误1349(HY000):视图的SELECT在FROM子句中包含一个子查询 如果这是MySQL引擎的限制,那么为什么他们还没有实现此功能呢? 此外,对于此限制有哪些好的解决方法? 是否有任何变通方法可用于FROM子句中的任何子查询,或者是否存在某些无法在FROM子句中使用子查询无法表达的查询? 查询示例(已包含在注释中): SELECT temp.UserName FROM (SELECT u1.name as UserName, COUNT(m1.UserFromId) as SentCount FROM Message m1, User u1 WHERE u1.uid = m1.UserFromId Group BY u1.name HAVING SentCount > 3 ) as temp 回答1 您的查询不能仅写为: SELECT u1.name as UserName from Message m1, User u1 WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3 这也应该有助于解决MySQL中子查询的已知速度问题 回答2 我有同样的问题。
  • Codeigniter活动记录中的子查询(subquery in codeigniter active record)
    问题 SELECT * FROM certs WHERE id NOT IN (SELECT id_cer FROM revokace); 如何在CodeIgniter活动记录中编写以上选择语句? 回答1 ->where()支持将任何字符串传递给它,它将在查询中使用它。 您可以尝试使用以下方法: $this->db->select('*')->from('certs'); $this->db->where('`id` NOT IN (SELECT `id_cer` FROM `revokace`)', NULL, FALSE); where()中的,NULL,FALSE告诉CodeIgniter不要转义查询,这可能使查询混乱。 更新:您还可以检出我编写的子查询库。 $this->db->select('*')->from('certs'); $sub = $this->subquery->start_subquery('where_in'); $sub->select('id_cer')->from('revokace'); $this->subquery->end_subquery('id', FALSE); 回答2 不建议使用函数_compile_select()和_reset_select() 。 而是使用get_compiled_select() : #Create
  • SQL WITH子句示例(SQL WITH clause example [duplicate])
    问题 这个问题已经在这里有了答案: CTE和SubQuery之间的区别? (9个答案) 去年关闭。 我试图了解如何使用WITH子句的目的WITH子句。 我所了解的是, WITH子句替代了常规子查询。 谁能用一个小例子向我详细解释一下? 回答1 Oracle在Oracle 9i第2版数据库中引入了SQL WITH子句。 SQL WITH子句允许您为子查询块命名(过程也称为子查询重构),可以在主SQL查询中的多个位置引用该名称。 分配给子查询的名称被视为内联视图或表。 SQL WITH子句基本上是对常规子查询的直接替代。 SQL WITH子句的语法 以下是使用单个子查询别名时SQL WITH子句的语法。 WITH <alias_name> AS (sql_subquery_statement) SELECT column_list FROM <alias_name>[,table_name] [WHERE <join_condition>] 使用多个子查询别名时,语法如下。 WITH <alias_name_A> AS (sql_subquery_statement), <alias_name_B> AS(sql_subquery_statement_from_alias_name_A or sql_subquery_statement ) SELECT <column_list>
  • MySQL EXPLAIN Output Format(MySQL运维神技)
    摘要: DBA经常会用到的explain来查看SQL语句的执行计划,今天小人斗胆,从MySQL 5.7 Reference Manual中把MySQL EXPLAIN Output Format翻译过来。欢迎拍砖Explain语句提供了一个select语句执行计划的信息。Explain为每个用了select语句的表,返回一行信息。它列出了表中的顺序输出,MySQL会读取他们,然后再处理。MySQL解决了所有使用嵌套循环连接方法。这意味着MySQL会读取第一个表中的一行,然后在第二个表中找到一个匹配的行、第三个表,等等。当所有的表都被处理,MySQL输出所选择的列和回溯到的列表信息,直到发现有更多匹配行的表。下一行是从这个表中读取的,这个过程将继续同下一个表。在MySQL 5.7.3之前,EXTENDED的关键词还在被使用,explain产生的额外信息可以通过explain后面的show warnings解释。EXPLAIN EXTENDED也显示filtered列。在MySQL 5.7.3,扩展输出默认开启,扩展关键词不再必要。Note: You cannot usethe EXTENDED and PARTITIONS keywords together in the same EXPLAIN statement. In addition, neither of these
  • SQL Server中的子查询v / s内部联接(Subquery v/s inner join in sql server)
    问题 我有以下查询 第一个使用内部联接 SELECT item_ID,item_Code,item_Name FROM [Pharmacy].[tblitemHdr] I INNER JOIN EMR.tblFavourites F ON I.item_ID=F.itemID WHERE F.doctorID = @doctorId AND F.favType = 'I' 第二个使用子查询 SELECT item_ID,item_Code,item_Name from [Pharmacy].[tblitemHdr] WHERE item_ID IN (SELECT itemID FROM EMR.tblFavourites WHERE doctorID = @doctorId AND favType = 'I' ) 在此项目表中[Pharmacy].[tblitemHdr]包含15列和2000条记录。 [Pharmacy].[tblitemHdr]包含5栏和大约100条记录。 在这种情况下which query gives me better performance? 回答1 通常,联接比内部查询更快地工作,但实际上,它将取决于SQL Server生成的执行计划。 无论您如何编写查询,SQL Server都将始终根据执行计划对其进行转换。 如果它足够“聪明”
  • 子查询和相关子查询之间的区别(Difference between Subquery and Correlated Subquery)
    问题 下面的SQL查询是普通查询还是相关子查询? SELECT UserID, FirstName, LastName, DOB, GFName, GLName, LoginName, LoginEffectiveDate, LoginExpiryDate, Password, Email, ReportingTo, Mobile, CommunicationPreference, IsActive FROM (SELECT row_number() OVER (ORDER BY FirstName) AS Row, UserID, FirstName, LastName, DOB, GFName, GLName, LoginName, LoginEffectiveDate, LoginExpiryDate, Password, Email, ReportingTo, Mobile, CommunicationPreference, IsActive FROM DivakarUserRegistration) T 另外,有人可以说明两者之间的区别吗 回答1 关联子查询是使用外部查询中的值的子查询。 在这种情况下,必须对外部查询的每一行执行内部查询。 在此处查看示例http://en.wikipedia.org/wiki/Correlated_subquery
  • 原则 2:如何使用子查询列(在 SELECT 子句中)(Doctrine 2: how do you use a subquery column (in the SELECT clause))
    问题 我正在尝试使用 SELECT 子句中的子查询执行简单的选择查询,但根本没有找到执行此操作的方法。 我已经尝试过 DQL 和 QueryBuilder,但都不起作用。 代码如下,请不要说我只能使用连接,这是一个简化的示例,只是为了说明问题,我有子查询的合法用例。 // With QueryBuilder $query = $qb->select(array('a', '(SELECT at.addresstypeName FROM e:Addresstype at WHERE at.addresstypeId = a.addresstypeId ) AS addresstypeName')) ->from('e:Address', 'a') ->where('a.addressId = :addressId') ->setParameter('addressId', 1); // With DQL $dql = "SELECT a, (SELECT at.addresstypeName FROM e:Addresstype at WHERE at.addresstypeId = a.addresstypeId ) AS addresstypeName FROM e:Address a WHERE a.addressId = :addressId"; $query = $em-
  • 在列子句中带有子查询的MS SQL Server数据透视表(MS SQL Server pivot table with subquery in column clause)
    问题 我肯定这是一种简单的技术,尽管到目前为止我还没有找到答案! 我有 TIMESTAMP | POINTNAME | VALUE 2012-10-10 16:00:00 AHU01 20 2012-10-10 16:00:00 AHU02 25 2012-10-10 16:00:15 AHU01 26 2012-10-10 16:00:15 AHU02 35 等等...(大约800个POINTNAMES) 具有许多点名,我不想在数据透视表“ FOR”(如下面给出的语法)定义的“ IN”子句中列出每一个,但希望使用子查询。 所以我想要的是将所有POINTNAME值作为带有TIMESTAMP AND VALUE列的列,所以我将获得一个TIMESTAMP值,并且每个POINTNAME包含许多列,每个POINTNAME PER TIMESTAMP仅有一个值,所以我不需要汇总有什么可以选择的吗? 就像是: SELECT [TIMESTAMP] FROM ( SELECT * FROM POINT_TABLE) PIVOT( Max[Value] FOR [POINTNAME] IN (SELECT DISTINCT [POINTNAME] FROM POINT_TABLE) 会产生- TIMESTAMP AHU01 AHU02 2012-10-10 16:00:00 20 25 2012
  • 用于EXISTS和IN的火花替换(Spark replacement for EXISTS and IN)
    问题 我正在尝试运行使用EXIST子句的查询: select <...> from A, B, C where A.FK_1 = B.PK and A.FK_2 = C.PK and exists (select A.ID from <subquery 1>) or exists (select A.ID from <subquery 2>) 不幸的是,这似乎不受支持。 我也尝试过用IN子句替换EXISTS子句: select <...> from A, B, C where A.FK_1 = B.PK and A.FK_2 = C.PK and A.ID in (select ID from ...) or A.ID in (select ID from ...) 不幸的是, IN子句似乎也不受支持。 关于如何编写可实现所需结果的SQL查询的任何想法? 我原则上可以将WHERE子句建模为另一个JOIN ,将第二个OR子句建模为UNION但这似乎太笨拙了。 编辑:列出了许多可能的解决方案。 解决方案1 select <...> from A, B, C (select ID from ...) as exist_clause_1, (select ID from ...) as exist_clause_2, where A.FK_1 = B.PK and A.FK_2 = C
  • tomcat如何增大并发_系统的性能瓶颈,排查该从哪些方面入手,如何定位?
    一、如何排查系统的性能瓶颈点? 梳理系统的性能瓶颈点这件事应该不是一件简单的事情,需要针对不同设计的系统来进行单独分析。 首先一套完整可用的系统应该是有ui界面的(这里强调的是一套完整的,可用的系统,而并不是指单独的一个中台系统),系统分为了前端模块和后端模块。 这里由于我个人的擅长领域更多是处于后端模块,所以对于系统的瓶颈点梳理我会从后端进行分析。 这里我结合常用的nginx+tomcat+redis+mysql这类常见架构进行分析: 请求入口 所有的请求打入到后台的服务当中,首先需要考虑的一个点就是: 1、带宽因素 假设有200m的流量同时请求进入服务器,但是带宽只有1m,这么来算光是接收这批数据量信息也要消耗大约200s的时间。带宽可以理解为在指定时间内从一端请求到另一端的流量总量。而且局域网和广域网的带宽计算其实也是不一样的 2、服务器的ulimit 通常我们使用的线上服务器都是centos系列,这里我列举centos7相关的系统配置:ulimit配置 查看服务器允许的最大打开文件数目(linux系统中设计概念为一切皆文件) 通常如果我们的java程序需要增大一些socket的链接数目,可以通过调整ulimit 里面的open参数进行配置。 [root@izwz9ic9ggky8kub9x1ptuz ~]# ulimit -a | grep open open files
  • Subquery using Exists 1 or Exists *(Subquery using Exists 1 or Exists *)
    问题 我以前是这样写我的EXISTS检查的: IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET ColumnsX=ValuesX WHERE Where Columns=@Filters END 前世的一位DBA告诉我,当我执行EXISTS子句时,请使用SELECT 1而不是SELECT * IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters END 这真的有区别吗? 回答1 不,SQL Server很聪明,并且知道它已用于EXISTS,并且不向系统返回任何数据。 Quoth Microsoft:http://technet.microsoft.com/en-us/library/ms189259.aspx?ppud=4 由EXISTS引入的子查询的选择列表几乎总是由星号(*)组成。 没有理由列出列名,因为您只是在测试是否存在满足子查询中指定条件的行。 要检查自己,请尝试运行以下命令: SELECT whatever FROM yourtable WHERE EXISTS( SELECT 1/0
  • 您无法在FROM子句中指定目标表“ NAME”进行更新(You can't specify target table 'NAME' for update in FROM clause)
    问题 我试图将此解决方案应用于我的MySQL DB中具有重复项的表中的数据。 我得到这样的错误: SQL Error [1093] [HY000]: You can't specify target table 'NAME' for update in FROM clause DELETE NAME FROM NAME WHERE NAME.id NOT IN (SELECT MIN(id) FROM NAME GROUP BY col1, col2) 也尝试过分配别名-但没有成功。 出现此错误的原因是什么? 通常指出SQL脚本可以产生循环过程,但是在这里我实际上看不到任何相关信息-很明显,对于DELETE和SELECT两个选择是分离的-引擎必须首先执行一次SELECT ,然后在WHERE条件下使用它DELETE 。 那么-为什么会发生此错误,以及如何真正对表进行重复数据删除呢? =) 回答1 试试这个可能对你有帮助 DELETE FROM NAME WHERE NAME.id NOT IN ( SELECT * FROM ( SELECT MIN(id) FROM NAME GROUP BY col1,col2 ) AS p ) 阅读更多 回答2 您的查询是正确的,并且可以在其他DBMS上使用,但是MySQL不允许您从表中更新或删除以及在子查询中从同一表中选择。
  • 为什么临时表和子选择之间存在巨大的性能差异(Why is there a HUGE performance difference between temp table and subselect)
    问题 这是有关SQL Server 2008 R2的问题 到目前为止,我不是DBA。 我是一名Java开发人员,必须不时编写SQL。 (大部分嵌入代码中)。 我想知道我在这里做错了什么,如果是,我该怎么做才能避免再次发生。 Q1: SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ... Q1具有14个联接 Q2与Q1相同,但有一个例外。 (SELECT * FROM T1 WHERE condition1)之前已执行,并存储在临时表中。 这不是一个相关的子查询。 Q2: SELECT * INTO #tempTable FROM T1 WHERE condition1 SELECT something FROM #tempTable JOIN ... 同样,有14个加入。 现在令我感到困惑的是,Q1花费了2分钟以上的时间(尝试了几次,以避免缓存发挥作用),而Q2花费了2秒的时间(两个查询都合并了!)! 是什么赋予了? 回答1 为什么不建议使用子查询? Database Optimizer(无论使用什么数据库)都不能始终正确地优化此类查询(带有子查询)。 在这种情况下,优化器面临的问题是选择正确的方法来连接结果集。 有几种连接两个结果集的算法。 算法的选择取决于一个和另一个结果集中包含的记录数。
  • Django ORM。 联接子查询(Django ORM. Joining subquery)
    问题 我有一个表,其中包含一些网站的列表和一个包含其统计信息的表。 class Site(models.Model): domain_name = models.CharField( max_length=256, unique=True, ) class Stats(models.Model): date = models.DateField() site = models.ForeignKey('Site') google_pr = models.PositiveIntegerField() class Meta: unique_together = ('site', 'date') 我想查看所有站点和统计信息的具体日期。 如果该日期的统计记录不存在,则选择内容必须仅包含网站。 如果我使用: Site.objects.filter(stats__date=my_date) 我不会得到它没有记录网站my_date在stats表中。 因为在这种情况下,SQL查询将如下所示: SELECT * FROM site LEFT OUTER JOIN stats ON site.id = stats.site_id WHERE stats.date = 'my_date' 查询条件将排除具有NULL日期的记录,并且没有统计信息的站点将不包括在选择中。 就我而言,我需要联接统计表
  • MySQL—子查询(where 型子查询 from 型子查询 exists 型子查询 复制表子查询)
    MySQL—子查询 知识大纲 概念where 型子查询from 型子查询exists 型子查询复制表子查询 1.概念 某些情况下,当进行一个查询时,需要的条件或数据要用另外一个 select 语句的结果, 这个时候,就要用到子查询; 为了给主查询(外部查询)提供数据而首先执行的查询(内部查询)被叫做子查询; 一般根据子查询的嵌入位置分为,where 型子查询,from 型子查询,exists 型子查询。 2.where 型子查询 where 型子查询即把内层 sql 语句查询的结果作为外层 sql 查询的条件. 子查询要包含在括号内。建议将子查询放在比较条件的右侧。单行操作符对应单行子查询,多行操作符对应多行子查询。 单行操作符 右边子查询必须返回的是单个值,单行比较运算符(=,>,>=,<,<=,<>)多行操作符 右边子查询可以返回多行,但必须是单列,ALL, ANY,IN 其 中,ALL 和 ANY 运算符必须与单行比较运算符(=,>,>=,<,<=,<>)结 合使用 IN:等于任何一个 ALL:和子查询返回的所有值比较。例如:sal>ALL(1,2,3)等价于 sal>1 && sal>2 && sal>3,即大于所有。 ANY:和子查询返回的任意一个值比较。例如:sal>ANY(1,2,3)等价于 sal>1 or sal>2 or sal>3,即大于任意一个就可以。
  • MySQL性能分析之Explain
    目录Explain基础Explain进阶Explain基础关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output ,这里需要强调rows是核心指标,绝大部分rows小的语句执行一定很快(有例外,下面会讲到)。所以优化语句基本上都是在优化rows。执行计划:让mysql预估执行操作(一般正确) all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const id,email 慢: select * from userinfo3 where name='nick' explain select * from userinfo3 where name='nick' type: ALL(全表扫描) select * from userinfo3 limit 1; 快: select * from userinfo3 where email='nick' type: const(走索引)Explain进阶Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。Explain语法:explain select