select查询的复杂性,其中列表中的id和表的id被索引

时间:2017-09-05 11:54:27

标签: mysql indexing time-complexity

以下查询的复杂性(每个查询的扫描行)是什么?

select col_name from table where id in (list).

表在id上编制索引。 是否每行都将被扫描并仅获取列表中具有id的行,或者它将仅访问列表中具有id的行?

2 个答案:

答案 0 :(得分:0)

谢谢, 我找到了这个问题的答案。 以下查询可以告知特定查询命中访问的行数。

explain select col_name from table where id in (list).

more detailed answer

答案 1 :(得分:0)

template<typename... Ts> struct MaxSizeof { static constexpr size_t value = 0; }; template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> { static constexpr size_t value = std::max(sizeof(T), typename MaxSizeof<Ts...>::value); }; 可能会给你一个猜测。以下将是准确的:

EXPLAIN

示例:

FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';

请注意,读取了13行,而不是表中的5484行。 (这需要mysql> SELECT city, population FROM canada WHERE id IN (295560,295007,297104,293500,293583,297001,291726,296573,296239,295210,293022,295192,293038); +----------------+------------+ | city | population | +----------------+------------+ | Abbotsford | 151685 | | Drummondville | 59489 | | Duncan | 22199 | | Glace Bay | 21504 | | Grande Prairie | 41463 | | New Glasgow | 20322 | | Orangeville | 32641 | | Ottawa | 874433 | | Prince George | 65558 | | Saskatoon | 198957 | | Stratford | 30234 | | Waterloo | 110800 | | White Rock | 66450 | +----------------+------------+ 13 rows in set (0.01 sec) mysql> show session status like 'Handler%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Handler_commit | 1 | | Handler_delete | 0 | | Handler_discover | 0 | | Handler_external_lock | 2 | | Handler_mrr_init | 0 | | Handler_prepare | 0 | | Handler_read_first | 0 | | Handler_read_key | 13 | -- Note | Handler_read_last | 0 | | Handler_read_next | 0 | | Handler_read_prev | 0 | | Handler_read_rnd | 0 | | Handler_read_rnd_next | 0 | | Handler_rollback | 0 | | Handler_savepoint | 0 | | Handler_savepoint_rollback | 0 | | Handler_update | 0 | | Handler_write | 0 | +----------------------------+-------+ 18 rows in set (0.00 sec) 上的KEY。)