在mysql中执行带和不带索引的查询
Posted
技术标签:
【中文标题】在mysql中执行带和不带索引的查询【英文标题】:executing queries with and without indexes in mysql 【发布时间】:2016-05-12 10:44:00 【问题描述】:我必须在 mysql 中运行带索引和不带索引的相同查询。 我创建这样的索引:
create index index_1 on table_1(column_name);
create index index_2 on table_2(column_name);
我执行此操作,两次都得到 0 行影响的结果。这样可以吗?
因为当我执行我拥有的查询时(在我创建索引之后),我花费的时间与以前相同(没有索引)。
数据库视图:
我有多个关于这个数据库的小查询,例如
SELECT DISTINCT customers.customer_id, customers.customer_name
FROM customers
INNER JOIN accounts ON customers.customer_id = accounts.customer_id
INNER JOIN transactions ON transactions.account_id = accounts.account_id
WHERE transactions.trn_date >= '2011/05/01'
AND transactions.trn_date <= '2011/05/31'
ORDER BY customers.customer_id
【问题讨论】:
信息太少。我们需要表定义、查询等。 索引是? 我们必须根据自己的判断在基表上创建 2 个索引,以减少查询的执行时间,但仍会略微增加新数据的加载时间 【参考方案1】:该查询需要这些索引:
transactions: INDEX(trn_date)
accounts: INDEX(account_id)
customers: INDEX(customer_id)
在最后两种情况下,您可能已经将该列作为PRIMARY KEY
。如果是这样,请不要添加多余的INDEX
。
【讨论】:
【参考方案2】:我执行这个,我得到了 0 行影响的结果,两者 次。这样可以吗?
是的,没关系。 有 DDL 操作创建新对象并且不应该输出一些东西。
因为当我执行查询时(在我创建索引之后)它 像以前一样带我去(没有索引)
查询没有使用索引。内部优化器根据数据分布做出决策。例如,如果 column_name.table_1 有 50 个唯一值,则不使用索引。
更多细节可以在官方文档中找到:9.3.1 How MySQL Uses Indexes
【讨论】:
我们必须根据自己的判断在基表上创建 2 个索引,以减少查询的执行时间,并且仍然会略微增加新数据的加载时间@Pavel Zimogorov 您应该计算一下索引对改进选择查询和插入降级的好处。如果您有密集的数据负载,我建议您创建单独的表来检索数据(TRN_SELECT)。并且仅将 TRN 用于插入数据并选择用于填充 TRN_SELECT 的行以上是关于在mysql中执行带和不带索引的查询的主要内容,如果未能解决你的问题,请参考以下文章