Skip to content

MDEV-38072 Optimizer choosing the wrong plan#4928

Open
spetrunia wants to merge 1 commit into10.11from
bb-10.11-MDEV-38072-variant3
Open

MDEV-38072 Optimizer choosing the wrong plan#4928
spetrunia wants to merge 1 commit into10.11from
bb-10.11-MDEV-38072-variant3

Conversation

@spetrunia
Copy link
Copy Markdown
Member

When multiple indexes produce ordering that matches the ORDER BY ... LIMIT clause, like

INDEX idx1(kp1, kp2)
INDEX idx2(kp2)
and the query with
WHERE kp1=const ORDER BY kp2 LIMIT 2

then test_if_cheaper_ordering() in pre-11.0 versions will choose the index with the smallest KEY::user_defined_key_parts (idx2 in this example). This can produce a much worse query plan.

The fix is to do what MariaDB 11.0 would do: use the index for which we have the cheapest access method. The cost of access method here takes into account that we will stop after producing #LIMIT rows.

The fix is controlled by the
@@optimizer_adjust_secondary_key_costs=fix_order_by_index_choice
flag and is OFF by default.

When multiple indexes produce ordering that matches the
ORDER BY ... LIMIT clause, like

  INDEX idx1(kp1, kp2)
  INDEX idx2(kp2)
and the query with
  WHERE kp1=const ORDER BY kp2 LIMIT 2

then test_if_cheaper_ordering() in pre-11.0 versions will choose
the index with the smallest KEY::user_defined_key_parts (idx2 in
this example). This can produce a much worse query plan.

The fix is to do what MariaDB 11.0 would do: use the index for which
we have the cheapest access method. The cost of access method here
takes into account that we will stop after producing #LIMIT rows.

The fix is controlled by the
  @@optimizer_adjust_secondary_key_costs=fix_order_by_index_choice
flag and is OFF by default.
@spetrunia spetrunia force-pushed the bb-10.11-MDEV-38072-variant3 branch from 59c0ac8 to b90ec0c Compare April 13, 2026 14:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

1 participant