Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Duplicate
-
10.3(EOL), 10.4(EOL)
-
None
Description
row_end is not used when searching by PRIMARY KEY
create table t (pk int primary key) with system versioning; |
insert into t values (1), (2); |
explain extended delete from t where pk=1; |
id select_type table type possible_keys key key_len ref rows filtered Extra |
1 SIMPLE t range PRIMARY PRIMARY 4 NULL 1 100.00 Using where |
explain extended update t set pk=11 where pk=1; |
id select_type table type possible_keys key key_len ref rows filtered Extra |
1 SIMPLE t range PRIMARY PRIMARY 4 NULL 1 100.00 Using where; Using buffer |
Both queries should affect only current system rows. In both queries PK is used which consists of (pk, row_end). row_end = current_timestamp is implied and it would be useful to use second keypart for filtering. But EXPLAIN shows only 4 bytes of key is used which means pk only.
Using row_end will not change correctness. But it can speed up some queries a bit.
Attachments
Issue Links
- duplicates
-
MDEV-18727 System Versioning: optimize DML operation
-
- Closed
-
Activity
Field | Original Value | New Value |
---|---|---|
Issue Type | Task [ 3 ] | Bug [ 1 ] |
Affects Version/s | 10.3 [ 22126 ] |
Summary | Use row_end when search by PRIMARY KEY | row_end is not used when searching by PRIMARY KEY |
Labels | need_feedback |
Labels | need_feedback |
Labels | need_feedback |
Assignee | Eugene Kosov [ kevg ] |
Labels | need_feedback |
Affects Version/s | 10.4 [ 22408 ] |
Fix Version/s | 10.3 [ 22126 ] | |
Fix Version/s | 10.4 [ 22408 ] |
Workflow | MariaDB v3 [ 86475 ] | MariaDB v4 [ 140725 ] |
Assignee | Eugene Kosov [ kevg ] | Aleksey Midenkov [ midenok ] |
Description |
{code:sql}
create table t (pk int primary key) with system versioning; insert into t values (1), (2); explain extended delete from t where pk=1; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t range PRIMARY PRIMARY 4 NULL 1 100.00 Using where explain extended update t set pk=11 where pk=1; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t range PRIMARY PRIMARY 4 NULL 1 100.00 Using where; Using buffer {code} Both queries should affect only current system rows. In both queries {{PK}} is used which consists of (pk, row_end). {{row_end = current_timestamp}} is implied and it would be useful to use second keypart for filtering. But {{EXPLAIN}} shows only 4 bytes of key is used which means {{pk}} only. Using {{row_end}} will not change correctness. But it can speed up some queries a bit. |
row_end is not used when searching by PRIMARY KEY
{code:sql} create table t (pk int primary key) with system versioning; insert into t values (1), (2); explain extended delete from t where pk=1; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t range PRIMARY PRIMARY 4 NULL 1 100.00 Using where explain extended update t set pk=11 where pk=1; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t range PRIMARY PRIMARY 4 NULL 1 100.00 Using where; Using buffer {code} Both queries should affect only current system rows. In both queries {{PK}} is used which consists of (pk, row_end). {{row_end = current_timestamp}} is implied and it would be useful to use second keypart for filtering. But {{EXPLAIN}} shows only 4 bytes of key is used which means {{pk}} only. Using {{row_end}} will not change correctness. But it can speed up some queries a bit. |
Summary | row_end is not used when searching by PRIMARY KEY | Index is not used for row_end in UPDATE/DELETE |
Status | Open [ 1 ] | In Progress [ 3 ] |
Link |
This issue duplicates |
Fix Version/s | N/A [ 14700 ] | |
Fix Version/s | 10.3 [ 22126 ] | |
Fix Version/s | 10.4 [ 22408 ] | |
Resolution | Duplicate [ 3 ] | |
Status | In Progress [ 3 ] | Closed [ 6 ] |
Why does it not happen automatically? The WHERE clause is expanded to include a condition on row_end. Optimizer should notice that all key parts of a primary key are defined and use the eq_ref.