2

4,000 万レコードのテーブルがあります。

私がリクエストをするとき:

SELECT COUNT(*) 
FROM shares
WHERE id > 36725307
AND our_result = 'N'

インデックス オンour_resultが使用されます。

別の値を使用するステートメントでは、次のようになります。

SELECT COUNT(*)
FROM shares
WHERE id > 36725307
AND our_result = 'Y'

インデックスは使用されません。

my.cnf

key_buffer_size         = 900M
join_buffer_size        = 512M
query_cache_size        = 128M
thread_cache_size       = 8
query_cache_limit       = 64M
tmp_table_size          = 512M
max_heap_table_size     = 128M
key_buffer_size         = 256M
key_cache_division_limit= 70
max_heap_table_size     = 256M
sort_buffer_size        = 128M  
max_tmp_tables          = 64
table_cache             = 2048
read_rnd_buffer_size    = 128M

フィールドを持つレコードour_works = Y: 3,700 万フィールドを
持つレコードour_works = N: 200 万

2 番目のクエリでインデックスが使用されないのはなぜですか?

4

2 に答える 2

1

カーディナリティの低いインデックスは悪いニュースです。カーディナリティとは、列内の一意の値の数を意味します。数百万の行がすべて同じ値を持つ場合、インデックスはほとんど役に立ちません。

参考のためにこれをチェックしてください:http://www.lullabot.com/blog/article/slow-queries-check-cardinality-your-mysql-indexes

実行EXPLAIN SELECT COUNT( * ) FROM shares WHERE id >36725307 AND our_result = 'Y'すると、mysql がインデックスをどのように使用しているか (または使用していないか) が表示されます。

于 2013-09-22T05:49:44.937 に答える
0

理由がわかりました。彼のために予約された場所にメモリがあるため、インデックスで検索が実行されました。

于 2013-12-12T15:56:20.180 に答える