93825


MySqlの下記のコマンドでupdateでインデックスが使用されません。  
whereでカラムFlagSer、PriceUpdateTimeSerの順に判定を行っております。  
インデックス「flag_price_idx」はカラムFlagSer、PriceUpdateTimeSerの複合インデックスです。  
カラムの順番も一致しているので通常であればインデックスが使用されるはずですが、使用されておりません。  
force indexでflag_price_idxの使用を強制しましたが結果は変わりませんでした。  
なぜこちらのインデックスが機能しないのでしょうか。  
ご指導いただけますと幸いです。

## コマンド

[code]

    update shop_his
    set FlagSer=FlagSer&(~128)
    where FlagSer&128&&
    PriceUpdateTimeSer<638117998611507506;
    
[/code]

## explain

[code]

    +----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
    | id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
    +----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
    |  1 | UPDATE      | shop_his | NULL       | index | NULL          | PRIMARY | 1026    | NULL | 4818 |   100.00 | Using where |
    +----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
    
[/code]

## index

[code]

    +----------+------------+----------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
    | Table    | Non_unique | Key_name       | Seq_in_index | Column_name        | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
    +----------+------------+----------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
    | shop_his |          0 | PRIMARY        |            1 | URL                | A         |        5335 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | get_next_data  |            1 | FlagSer            | A         |          27 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | get_next_data  |            2 | LastExeTimeSer     | A         |        5016 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | name           |            1 | Name               | A         |        3386 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | pricetime_flag |            1 | FlagSer            | A         |          13 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | pricetime_flag |            2 | PriceUpdateTimeSer | A         |        5307 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | flag_url       |            1 | FlagSer            | A         |          36 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | flag_url       |            2 | URL                | A         |        5186 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | url_flag       |            1 | URL                | A         |        5152 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | url_flag       |            2 | FlagSer            | A         |        4852 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | version_time   |            1 | VersionSer         | A         |           1 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | version_time   |            2 | LastExeTimeSer     | A         |        5074 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | dhash_flag     |            1 | FlagSer            | A         |          34 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | dhash_flag     |            2 | DHashUpdateTimeSer | A         |        3780 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | flag_idx       |            1 | FlagSer            | A         |          39 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | flag_price_idx |            1 | FlagSer            | A         |          20 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    | shop_his |          1 | flag_price_idx |            2 | PriceUpdateTimeSer | A         |        4570 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
    +----------+------------+----------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
    
[/code]

## カラム

[code]

    +--------------------+---------------------+------+-----+---------+-------+
    | Field              | Type                | Null | Key | Default | Extra |
    +--------------------+---------------------+------+-----+---------+-------+
    | Name               | varchar(512)        | NO   | MUL | NULL    |       |
    | URL                | varbinary(1024)     | NO   | PRI | NULL    |       |
    | LastExeTimeSer     | bigint(20)          | NO   |     | NULL    |       |
    | FlagSer            | int(10) unsigned    | NO   | MUL | NULL    |       |
    | SiteName           | varchar(512)        | NO   |     | NULL    |       |
    | PriceUpdateTimeSer | bigint(20)          | NO   |     | NULL    |       |
    | VersionSer         | bigint(19) unsigned | NO   | MUL | NULL    |       |
    | GrossDataNum       | int(11)             | YES  |     | NULL    |       |
    | DHashUpdateTimeSer | bigint(20)          | NO   |     | NULL    |       |
    | LastSuccessTimeSer | bigint(20)          | NO   |     | NULL    |       |
    +--------------------+---------------------+------+-----+---------+-------+
    
[/code]

## SQLバージョン

8.0.18


CC BY-SA 4.0
2023-02-13T03:33:31.003
93819
2023-02-14T04:53:11.127
57080
question
mysql
MySqlのupdateでインデックスが使用されない


基本的に、以下の操作を行うとインデックスは使用されません。

  1. 索引列に演算を行なっている
  2. 索引列にIS NULL 述語を使っている
  3. 索引列に対してSQL関数を適用している
  4. 索引列に不一致（<>）を用いている
  5. 索引列にORを用いている（IN句ならOK）
  6. 索引列に後方一致、または中間一致のLIKE述語を用いている
  7. 索引列が暗黙の型変換を行なっている
  8. 複合インデックスの場合に、列の順番を間違えている 
    * ○ SELECT * FROM SomeTable WHERE col_1 = 10 AND col_2 = 100 AND col_3 = 500;
    * ○ SELECT * FROM SomeTable WHERE col_1 = 10 AND col_2 = 100;
    * × SELECT * FROM SomeTable WHERE col_1 = 10 AND col_3 = 500;
    * × SELECT * FROM SomeTable WHERE col_2 = 100 AND col_3 = 500;
    * × SELECT * FROM SomeTable WHERE col_2 = 100 AND col_1 = 10;

かなり古い記述ですがMysql下でビット演算後にインデックスが利くかどうかについて、  
利かないとの回答が出ているので、仕様が変わっていなければ利かないでしょう。  
<https://forums.mysql.com/read.php?24,35318,35318#msg-35318>


CC BY-SA 4.0
2023-02-13T08:48:40.970
93825
2023-02-13T08:48:40.970
25396
93819
answer