Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# )_C#_Mysql - Fatal编程技术网

C# )

C# ),c#,mysql,C#,Mysql,就最佳方法而言,我们通常最好让MySQL进行行的“匹配”,而不是在客户机代码中进行匹配。(为什么不必要地把我们的代码弄得乱七八糟,而这样做通常可以在数据库中更有效地完成。)是的,有时我们需要在代码中进行匹配。有时它会变得更快 但有时,我们可以只编写一条SELECT语句来指定要返回的集合,然后让MySQL试试。如果速度慢,我们可以进行一些调整,查看执行计划,确保有合适的索引可用,并调整查询 给定问题中关于要返回的集合的信息,并假设dealerId在guaranteedalers表中是唯一的。如果我

就最佳方法而言,我们通常最好让MySQL进行行的“匹配”,而不是在客户机代码中进行匹配。(为什么不必要地把我们的代码弄得乱七八糟,而这样做通常可以在数据库中更有效地完成。)是的,有时我们需要在代码中进行匹配。有时它会变得更快

但有时,我们可以只编写一条SELECT语句来指定要返回的集合,然后让MySQL试试。如果速度慢,我们可以进行一些调整,查看执行计划,确保有合适的索引可用,并调整查询

给定问题中关于要返回的集合的信息,并假设
dealerId
guaranteedalers
表中是唯一的。如果我们的“测试”是
guaranteAlers
表中是否存在匹配行,那么我们可以使用外部联接操作,以及选择列表中返回0或1的表达式,具体取决于是否找到匹配行

 SELECT p.id
      , p.name
      , p.cityId
      , p.dealerId
      , p.price
      , IF(d.dealerId IS NULL,0,1) AS isGuarantee
   FROM products p
   LEFT
   JOIN guaranteeDealers d
     ON d.dealerId = p.dealerId
  ORDER BY ...
为了获得最佳性能,我们需要定义合适的索引。以最小值(如果尚未定义此类索引)


如果在生成我们要查找的结果时还涉及其他表,那么我们希望在执行的查询中也涉及该表。这将使MySQL优化器有机会提出最有效的计划来返回整个集合。并且不限制MySQL执行单个操作以逐段返回位。

Q:“为什么MySQL中select语句中的函数要花这么长时间执行?”

就性能而言,执行一个相关子查询50000次将吃掉我们的午餐,如果我们不小心,它也会吃掉我们的午餐盒

该子查询将针对外部查询返回的每一行执行。这就像执行50000个单独的SELECT语句。这需要时间

在MySQL存储程序(函数)中隐藏相关子查询没有帮助。这只会增加子查询每次执行的开销,并使速度变慢。如果我们去掉函数并将子查询内联,我们可能会看到如下情况:

 SELECT p.id
      , p.name
      , p.cityId
      , p.dealerId
      , p.price
      , IFNULL( ( SELECT 1
                    FROM guaranteeDealers d
                   WHERE d.dealerId = p.dealerID
                   LIMIT 1
                )
        ,0) AS isGuarantee
   FROM products p
  ORDER BY ...
对于从
产品
返回的每一行(没有被谓词过滤掉,例如WHERE子句中的条件),这实际上是告诉MySQL执行一个单独的SELECT语句。运行查询以查看
guaranteedalers
表中是否找到
dealerID
。每行都会发生这种情况

如果外部查询只返回几行,那么只需要执行几条额外的SELECT语句,我们不会真正注意到额外的时间。但当我们返回几十(或数百)行时,这就开始累积了。就所有这些查询执行所花费的总时间而言,这会变得昂贵

如果我们在MySQL存储程序(函数)中“隐藏”该子查询,则会增加更多开销,引入大量上下文切换。通过在数据库上下文中执行查询,调用一个函数,该函数切换到执行该函数的存储程序引擎,该引擎随后需要运行数据库查询,该查询切换回数据库上下文以执行查询并返回结果集,切换回存储程序环境以处理结果集并返回值,然后切换回原始数据库上下文以获取返回值。如果我们不得不这样做几次,那就没什么大不了的了。重复数万次,开销就会增加

(请注意,本机MySQL内置函数没有相同的上下文切换开销。本机函数是在数据库上下文中执行的编译代码。这是我们支持本机函数而不是MySQL存储程序的一个重要原因。)


如果我们想要提高性能,我们需要抛弃处理RBAR(一行接一行),这对于大型集合来说非常缓慢。我们需要按问题集而不是按行处理问题

我们可以告诉MySQL将返回什么,并让它找出最有效的返回方法。而不是我们来回往返于数据库,执行单个SQL语句以逐段获取集合的一小部分,使用指示MySQL应该如何准备集合的指令


回答这个问题

问:“哪种方法是正确的?”

这两种方法都是“正确”的,因为它们返回的是我们要查找的集合

第二种方法“更好”,因为它显著减少了需要执行的SELECT语句的数量(2条语句而不是50001条语句)

就最佳方法而言,我们通常最好让MySQL进行行的“匹配”,而不是在客户机代码中进行匹配。(为什么不必要地把我们的代码弄得乱七八糟,而这样做通常可以在数据库中更有效地完成。)是的,有时我们需要在代码中进行匹配。有时它会变得更快

但有时,我们可以只编写一条SELECT语句来指定要返回的集合,然后让MySQL试试。如果速度慢,我们可以进行一些调整,查看执行计划,确保有合适的索引可用,并调整查询

给定问题中关于要返回的集合的信息,并假设
dealerId
guaranteedalers
表中是唯一的。如果我们的“测试”是
guaranteAlers
表中是否存在匹配行,那么我们可以使用外部联接操作,以及选择列表中返回0或1的表达式,具体取决于是否找到匹配行

 SELECT p.id
      , p.name
      , p.cityId
      , p.dealerId
      , p.price
      , IF(d.dealerId IS NULL,0,1) AS isGuarantee
   FROM products p
   LEFT
   JOIN guaranteeDealers d
     ON d.dealerId = p.dealerId
  ORDER BY ...
为了获得最佳性能,我们需要定义合适的索引。至少
 SELECT p.id
      , p.name
      , p.cityId
      , p.dealerId
      , p.price
      , IF(d.dealerId IS NULL,0,1) AS isGuarantee
   FROM products p
   LEFT
   JOIN guaranteeDealers d
     ON d.dealerId = p.dealerId
  ORDER BY ...
 ON guaranteeDealers (dealerId)