explain的难以捉摸的响应以及如何决定在mysql中添加索引
我们有一个非常大的数据库,用非常简单的术语问这个问题,我无法决定是否应该在日期字段上添加索引 我的问题是:我是否应该为表A添加一个日期字段索引,它非常大,并且是日期字段(格式:2013-02-26 18:52:23)。以下是我的疑问: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')
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相比,您对这个表进行的插入相对较少,那么您就可以拥有这个额外的索引,即使它对这个特定的查询没有帮助