我有一张包含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'
未使用索引。
的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
的记录:3700万
字段our_works = N
的记录:200万
为什么索引不在第二个查询中使用?
答案 0 :(得分: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如何使用(或不使用)索引。
答案 1 :(得分:0)
我找到了原因。 由于内存超过为他保留的位置,因此已对索引执行了搜索。