sql >> データベース >  >> RDS >> Mysql

おそらくインデックスが悪い、全表スキャン

    あなたが上でしたことを実行すると、私は得ます

    EXPLAIN select * from  stats_clicked s 
    join visitor v on s.visitor_id=v.id 
    +----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
    | id | select_type | table | type | possible_keys | key    | key_len | ref                | rows | Extra       |
    +----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
    |  1 | SIMPLE      | v     | ALL  | PRIMARY       | NULL   | NULL    | NULL               |   15 | NULL        |
    |  1 | SIMPLE      | s     | ref  | index3,index1 | index3 | 4       | so_gibberish2.v.id |    1 | Using index |
    +----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
    

    ただし、切り捨てた場合は、次のような大量のデータのロードを実行します(最終的には10万行を超える):

    truncate table visitor;
    
    insert into visitor (`visited_time`) values
    (1467122944),(1467122944),(1467122944),
    (1467122944),(1467122944),(1467122944),
    (1467122944),(1467122944),(1467122944),
    (1467122944),(1467122944),(1467122944),
    (1467122944),(1467122944),(1467122944);
    
    insert into visitor (`visited_time`) values
    (1467122945),(1467122945),(1467122945),
    (1467122945),(1467122945),(1467122945),
    (1467122945),(1467122945),(1467122945),
    (1467122945),(1467122945),(1467122945),
    (1467122945),(1467122945),(1467122945),
    
    
    insert into visitor (`visited_time`) values
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946),
    (1467122946),(1467122946),(1467122946);
    
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    insert visitor(`visited_time`) select `visited_time` from visitor;
    
    select count(*) from visitor;
    -- 104448 rows
    

    その結果、 NOT テーブルスキャン:

    EXPLAIN select * from  stats_clicked s 
    join visitor v on s.visitor_id=v.id; 
    
    +----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
    | id | select_type | table | type   | possible_keys | key     | key_len | ref                        | rows | Extra       |
    +----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
    |  1 | SIMPLE      | s     | index  | index3,index1 | index3  | 9       | NULL                       |   22 | Using index |
    |  1 | SIMPLE      | v     | eq_ref | PRIMARY       | PRIMARY | 4       | so_gibberish2.s.visitor_id |    1 | NULL        |
    +----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
    

    その理由は、マニュアルページMySQLがインデックスを使用する方法<にリストされています。 / a> :

    上記の理由。あなたの質問の例では、インデックスを使用する価値のある行が少なすぎました。そのため、dbエンジンは、小さなテーブルでインデックスを使用しないという、おそらく(そしておそらく)より高速な方法を選択しました。



    1. MySQLエラー1(HY000)ファイルErrcode2の作成で問題が発生しました

    2. 存在する場合はレコードを更新し、存在しない場合はMySQLに挿入します

    3. PostgreSQL:集計関数を使用したUPDATE

    4. 関数は、複数の列ではなく、単一の列として複数の列を返します