ホームページ  >  に質問  >  本文

数据库 - MySQL 单表500W+数据,查询超时,如何优化呢?

伊谢尔伦伊谢尔伦2743日前755

全員に返信(4)返信します

  • 怪我咯

    怪我咯2017-04-17 16:53:13

    理由は、record_global_id 属性をフィルタリングしていますが、条件が等しくないため、複合インデックス以降の部分は使用されません。

    status 列はどのように区別されますか?インデックス (status, record_global_id) を追加して試してみてください。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 16:53:13

    複数の SQL に分割して個別にクエリを実行します。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 16:53:13

    質問によると、SQL には非常に多くの条件がありますが、使用できるインデックスは 1 つだけです。次の 'OR':

    は非常に明白です。 リーリー

    全体の大きな WHERE は 2 つの部分に分割できます。アイデアは UNION です。役に立った場合は、SQL 結果を直接投稿します。^_^

    変換後の SQL:

    リーリー

    うまくいったら、実行計画のスクリーンショットをコメントに送っていただけますか?自分の疑惑を検証したいのですが、ありがとう!

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 16:53:13

    複合インデックス (from_uid,to_uid,from_type,to_type,type,status,record_global_id) を作成します
    次のように SQL を Union に変更します:

    リーリー

    from_uid、to_uid、from_type、to_type、type、status に基づいてフィルタリングされた結果セットが小さい場合は、ユニオン サブクエリに AND を追加する必要はありません。record_global_id < 5407938 ORDER BY record_global_id DESC LIMIT 0, 20

    返事
    0
  • キャンセル返事