2

我有一张有 4000 万条记录的表。

当我提出请求时:

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

使用索引our_result

在使用不同值的语句中:

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

不使用索引。

我的.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:3700 万个
有字段的记录our_works = N:200 万

为什么第二个查询中没有使用索引?

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 回答