mysqlインデックスで理解しなければならないいくつかの重要な問題
2195 ワード
1、インデックスは何ですか.インデックスは、カラムに特定の値があるローをすばやく見つけるために使用されます.インデックスを使用しないで、mysqlは最初のレコードから関連するローが見つかるまでテーブル全体を読み込む必要があります.表が大きいほど、時間がかかります.テーブル内のクエリのカラムにインデックスがある場合、mysqlはデータファイルの中央にすばやく到達し、すべてのデータを表示する必要はありません.
ほとんどのmysqlのインデックス(primary key、index、unique、fulltext)はBツリーに格納されますが、空間列タイプのインデックスはRツリーを使用し、memoryテーブルはhashインデックスもサポートします.
2、インデックスは复雑ですね.インデックスをどう理解すればいいですか.もっとイメージ的な例はありませんか.想像してみてください.あなたの前に辞書があります.データは本の本文の内容で、あなたはそのcpuで、インデックスは本のカタログです.
3、インデックスが多ければ多いほどいいですか.ほとんどの場合、インデックスはクエリーの効率を大幅に向上させます.ただし、データ変更(削除)はインデックスを維持する必要があるため、より多くのインデックスはより多くのメンテナンスコストを意味します.また、より多くのコントロールスペースが必要であることを意味します(1冊の本は100ページですが、50ページのディレクトリがありますか?).小さな表を作ると、インデックスを作るのが遅くなるかもしれません(2ページのパンフレットを読んで、先にカタログを探す必要がありますか?)
4、インデックスのフィールドタイプ問題textタイプ、インデックスを作成することもできます(長さを指定する必要があります).mysiamストレージエンジンの長さは総合的に1000バイトを超えてはならない.フィルタに使用する値は、インデックス・カラムと同じデータ型を維持します.
5、likeはインデックスが使えますか?likeクエリを最小限に抑えることができますが、絶対に使用できないわけではありません.
インデックスは使用されません.
6、どのようなフィールドがインデックスを作成するのに適していませんか?カラムの値の一意性が小さすぎ(性別、タイプなど)、インデックスを作成するのに適していません.(サイズとは?一般的に、同じ値のデータがテーブルの15%を超えると、インデックスを作成する必要はありません)
非常に頻繁に更新されるデータはインデックスを作成するのに適していません.
7、1回のクエリーで複数のインデックスを使用できますか?できません
8、複数列のクエリはどのようにインデックスを作成しますか?1回のクエリでは、1つのインデックスしか使用できません.aカラムでインデックスを作成しますか、それともbカラムでインデックスを作成しますか.誰の区分度(同値の少ない)がもっと高くて、誰を建てますか!
もちろん、インデックスを組み合わせるのもいい方法です.
9、連合インデックスの問題
そのため、多くの場合、
10、インデックスを使用できない一般的な状況はどれですか?
次のように、列の関数演算を行います.
数値が格納されている文字列タイプフィールド(携帯電話番号など)は、値の引用符を失わないでください.そうしないと、インデックスにヒットしません.
Mobileフィールドが
11、NULLの問題
ほとんどのmysqlのインデックス(primary key、index、unique、fulltext)はBツリーに格納されますが、空間列タイプのインデックスはRツリーを使用し、memoryテーブルはhashインデックスもサポートします.
2、インデックスは复雑ですね.インデックスをどう理解すればいいですか.もっとイメージ的な例はありませんか.想像してみてください.あなたの前に辞書があります.データは本の本文の内容で、あなたはそのcpuで、インデックスは本のカタログです.
3、インデックスが多ければ多いほどいいですか.ほとんどの場合、インデックスはクエリーの効率を大幅に向上させます.ただし、データ変更(削除)はインデックスを維持する必要があるため、より多くのインデックスはより多くのメンテナンスコストを意味します.また、より多くのコントロールスペースが必要であることを意味します(1冊の本は100ページですが、50ページのディレクトリがありますか?).小さな表を作ると、インデックスを作るのが遅くなるかもしれません(2ページのパンフレットを読んで、先にカタログを探す必要がありますか?)
4、インデックスのフィールドタイプ問題textタイプ、インデックスを作成することもできます(長さを指定する必要があります).mysiamストレージエンジンの長さは総合的に1000バイトを超えてはならない.フィルタに使用する値は、インデックス・カラムと同じデータ型を維持します.
5、likeはインデックスが使えますか?likeクエリを最小限に抑えることができますが、絶対に使用できないわけではありません.
xxx%
はインデックスに使用できます.like
に加えて、次のオペレータもインデックスに使用できます.,>=,between,in
インデックスは使用されません.
<>,not in,!=
6、どのようなフィールドがインデックスを作成するのに適していませんか?カラムの値の一意性が小さすぎ(性別、タイプなど)、インデックスを作成するのに適していません.(サイズとは?一般的に、同じ値のデータがテーブルの15%を超えると、インデックスを作成する必要はありません)
非常に頻繁に更新されるデータはインデックスを作成するのに適していません.
7、1回のクエリーで複数のインデックスを使用できますか?できません
8、複数列のクエリはどのようにインデックスを作成しますか?1回のクエリでは、1つのインデックスしか使用できません.aカラムでインデックスを作成しますか、それともbカラムでインデックスを作成しますか.誰の区分度(同値の少ない)がもっと高くて、誰を建てますか!
もちろん、インデックスを組み合わせるのもいい方法です.
9、連合インデックスの問題
where a = 'xxx'
はab連合インデックスを使用することができる.where b = 'xxx'
はab連合インデックスにヒットできません.そのため、多くの場合、
ab
があるので、aインデックスを構築する必要はありません.10、インデックスを使用できない一般的な状況はどれですか?
like '%xxx'
not in
!=
次のように、列の関数演算を行います.
where md5(password) = "xxx"
数値が格納されている文字列タイプフィールド(携帯電話番号など)は、値の引用符を失わないでください.そうしないと、インデックスにヒットしません.
select * from test where mobile = 13800002222;
Mobileフィールドが
char
またはvarchar
のタイプである場合、上記のクエリはインデックスにヒットしません.11、NULLの問題
Null
はインデックスの形が虚構になるため、設計テーブル構造ではNULLの存在を避けるべきである.-1など、他の方法で表現できます.