Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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
explain的难以捉摸的响应以及如何决定在mysql中添加索引_Mysql_Sql_Performance_Optimization_Database - Fatal编程技术网

explain的难以捉摸的响应以及如何决定在mysql中添加索引

explain的难以捉摸的响应以及如何决定在mysql中添加索引,mysql,sql,performance,optimization,database,Mysql,Sql,Performance,Optimization,Database,我们有一个非常大的数据库,用非常简单的术语问这个问题,我无法决定是否应该在日期字段上添加索引 我的问题是:我是否应该为表A添加一个日期字段索引,它非常大,并且是日期字段(格式:2013-02-26 18:52:23)。以下是我的疑问: SELECT As.id FROM As INNER JOIN A_items ON A_items.A_id = As.id AND A_items.type IN ('BilledItem', 'CustomerItem')

我们有一个非常大的数据库,用非常简单的术语问这个问题,我无法决定是否应该在日期字段上添加索引

我的问题是:我是否应该为表A添加一个日期字段索引,它非常大,并且是日期字段(格式:2013-02-26 18:52:23)。以下是我的疑问:

      SELECT As.id 
      FROM As INNER JOIN A_items ON A_items.A_id = As.id AND A_items.type IN ('BilledItem', 'CustomerItem') 
      WHERE   (As.A_date BETWEEN '2013-01-15 18:52:23' AND '2013-01-30 18:52:23') AND A_items.category_id in ('20219') and A_items.product_id IN ('ACCDYHGYUDZNY7FZ')
现在,当我在上面使用explain时,它给出了以下结果:-

      *************************** 1. row ***************************
      id: 1
      select_type: SIMPLE
      table: A_items
      type: ref
      possible_keys: index_A_items_on_A_id,index_A_items_on_product_id,i_type_parent_id_item_type
      key: index_A_items_on_product_id
      key_len: 258
      ref: const
      rows: 221122
      Extra: Using where
      *************************** 2. row ***************************
      id: 1
      select_type: SIMPLE
      table: As
      type: eq_ref
      possible_keys: PRIMARY
      key: PRIMARY
      key_len: 8
      ref: database.A_items.A_id
      rows: 1
      Extra: Using where
      2 rows in set (0.00 sec)
但是,当我从查询中删除('ACCDYHGYUDZNY7FZ')中的_items.product_id并运行此命令时:-

      explain
      SELECT As.id 
      FROM As INNER JOIN A_items ON A_items.A_id = As.id AND A_items.type IN ('BilledItem', 'CustomerItem') 
      WHERE   (As.A_date BETWEEN '2013-01-15' AND '2013-01-30') AND A_items.category_id in ('2005')
我得到:

      *************************** 1. row ***************************
      id: 1
      select_type: SIMPLE
      table: As
      type: ALL
      possible_keys: PRIMARY
      key: NULL
      key_len: NULL
      ref: NULL
      rows: 15427520    <--Notice this big number
      Extra: Using where
      *************************** 2. row ***************************
      id: 1
      select_type: SIMPLE
      table: A_items
      type: ref
      possible_keys: index_A_items_on_A_id,i_type_parent_id_item_type
      key: index_A_items_on_A_id
      key_len: 8
      ref: database.As.id
      rows: 1
      Extra: Using where
      2 rows in set (0.00 sec)
******************************************1。划船***************************
身份证号码:1
选择类型:简单
表:As
类型:全部
可能的_键:主
键:空
密钥长度:空
ref:NULL

行:15427520在第一次查询中,您有更多的查询限制,更少的表扫描。这就是行数较少的原因。我认为在日期字段上添加索引应该可以加快查询速度(至少对我有帮助)。为什么不试试呢?

在第一个查询中,您有更多的查询限制,更少的表扫描。这就是行数较少的原因。我认为在日期字段上添加索引应该可以加快查询速度(至少对我有帮助)。为什么不试试呢?

我认为,在第二种情况下,如果行数与表中的行数相当接近,那么它会选择进行表扫描。这对我来说,日期索引可能会有所帮助,因为它会选择从索引中提取,而不是扫描整个表。

我认为,在第二种情况下,如果行数看起来相当接近表中的行数,它会选择进行表扫描。这对我来说,日期索引可能会有所帮助,因为它会选择从索引中提取,而不是扫描整个表。

这实际上取决于您的数据。你能做的最好的事情就是尝试使用这个索引。索引是否有用取决于查询类型,在本例中还取决于日期范围。如果所选范围很小,则索引应该会有所帮助。但是,例如,如果表只保存了1个月的数据,而您选择了20-25天的数据,那么优化器可能仍然会选择忽略索引。优化器总是会尝试选择生成较少行的索引(但它并不确切知道-这是由索引基数估计的,在某些情况下可能不准确)


拥有额外的索引不会影响选择,但每增加一个索引,所有插入和更新都会变慢,因为所有索引都需要更新。因此,如果与selects相比,您对该表的插入相对较少,那么您可以拥有这个额外的索引,即使它对这个特定的查询没有帮助。

这实际上取决于您的数据。你能做的最好的事情就是尝试使用这个索引。索引是否有用取决于查询类型,在本例中还取决于日期范围。如果所选范围很小,则索引应该会有所帮助。但是,例如,如果表只保存了1个月的数据,而您选择了20-25天的数据,那么优化器可能仍然会选择忽略索引。优化器总是会尝试选择生成较少行的索引(但它并不确切知道-这是由索引基数估计的,在某些情况下可能不准确)

拥有额外的索引不会影响选择,但每增加一个索引,所有插入和更新都会变慢,因为所有索引都需要更新。因此,如果与selects相比,您对这个表进行的插入相对较少,那么您就可以拥有这个额外的索引,即使它对这个特定的查询没有帮助