3

+列と+posts列の値をテーブルで検索することがよくあります。userstatususertime

SELECT * FROM `posts` WHERE `user`='xxx' and `status`='active'
SELECT * FROM `posts` WHERE `user`='xxx' and `time`>...

したがって、2つのインデックス(ユーザー、ステータス)と(ユーザー、時間)を設定しました

より多くのインデックスを更新する必要があるほど、書き込みプロセスが遅くなることを私は知っています。ただし、この場合、読み取り操作は書き込み操作よりもはるかに多いため、両方のインデックスを使用すると便利だと思います。

とにかく、PHPMyAdminは、「列ユーザーに対して複数のインデックスが作成されました」という警告を表示します。この警告を無視できますか?Wordpress DBテーブルを確認したところ、すでにインデックスが設定されている場合は、2番目の位置に列が配置されていることがわかりました。

comment_approved_date_gmt = INDEX(comment_approved, comment_date_gmt)
comment_date_gmt = INDEX(comment_date_gmt)

INDEX(comment_date_gmt)を保存する2列のインデックス(INDEX(comment_date_gmt、comment_authorized))を1つだけ使用しないのはなぜですか?また、同じ列名で始まる2つのインデックスがあると不利になるのはなぜですか。

クエリで最初に配置する必要がある一般的なルールはありますか?たとえば、異なるエントリの数が最も少ないもの(eGステータス)と、その後に異なる値の数が多いもの(たとえば、ユーザー名)

4

2 に答える 2

3

はい、インデックスの列の順序は重要です。

電話帳との類似性を考えてみてください。これは、(last_name、first_name)のインデックスのようなものです。家系の名前で人を検索するには、電話帳の並べ替え順序を使用して、すばやく見つけられるようにします。

しかし、あなたがその人の名しか知らないのなら、彼らは本のいたるところに散らばっています。1つを見つけるには、ページごとに本を検索する必要があります。

はい、インデックスは冗長になる可能性があります。

last_nameを検索するクエリは、(last_name)の単一列のインデックスを使用できます。または、(last_name、first_name)の2列のインデックスから同じ利点を得ることができます。では、なぜ両方のインデックスを作成するのでしょうか。

冗長インデックスの識別に役立つツールpt-duplicate-key-checkerがあります。そのようなインデックスが少なくともいくつかないデータベースに出くわしたことはありません。

phpMyAdminが間違っています。

phpMyAdminがインデックス(ユーザー、ステータス)と(ユーザー、時間)について警告している場合、これらのインデックスは相互に冗長ではないため、熱心すぎています。基本的に、その列が別のインデックスの列の左プレフィックスを構成する場合、インデックスは冗長です。したがって、インデックス(A)はインデックス(A、B)に関して冗長ですが、インデックス(A、C)は(A、B)とは異なり、両方を異なるクエリで使用できます。

PS:私はプレゼンテーションでこれらの点やその他の点をカバーしています。インデックスを設計する方法、本当に

于 2013-01-03T19:20:22.747 に答える
0

SQLクエリの列の順序は時期尚早の最適化であり、クヌースによれば、これがすべての悪の根源であると私は感じています。最適化ではなく、メンテナンスのためにプログラムし、オプティマイザーに速度を任せる必要があります。

于 2013-01-03T19:15:54.127 に答える