我有一个简单的ISAM表,大约2.2GB,有160万条记录。出于此问题的目的,查询是
SELECT 'one_unindexed_field' WHERE indexed_field > constant;
该表唯一不寻常的是它有一个大的无索引列VARCHAR(8192)。
如果'one_unindexed_field'=大型VARCHAR字段,则查询所需的时间约为同一查询的7倍。对于任何返回的记录(例如1000到100,000),此因子大致相同,因此可以假设您返回的记录集很容易适合记忆。
mysql> show global status like 'created_tmp_disk_tables';
报告正在创建零tmp_disk_tables。 EXPLAIN
会为任一查询返回相同的结果。
如何加快对此表的查询?如果不可能,有人可以解释发生了什么吗?
key_buffer_size=256M
tmp_table_size=64M
max_heap_table_size=64M
myisam_sort_buffer_size=88M
read_buffer_size=1M
read_rnd_buffer_size=2M
编辑:有一些点击建议将ROW_FORMAT更改为FIXED可能会加快我的查询...所以我这样做了,它实际上使查询稍慢。
编辑:我在Win10 64位,服务器版本:5.7.16-log MySQL社区服务器(GPL)
EXPLAIN返回:
mysql> EXPLAIN SELECT skw_stk_vol FROM tbl_skews WHERE (tday_date >= 42795);
id 1
select_type SIMPLE
table tbl_skews
partitions NULL
type range
possible_keys ndx_skews_tday_date
key ndx_skews_tday_date
key_len 4
ref NULL
rows 406921
filtered 100
Extra Using index condition
答案 0 :(得分:0)
如果要改进此查询,请尝试创建复合索引,以避免在找到匹配的行后查找表。
(indexed_field, 'one_unindexed_field')`
但问题是你不知道该查询花了多少时间。对于一个整数来说,一个大的varchar字段总是比较慢,因为数据会更大。
因此,如果像这样的查询工作,那么你可以做的更多。
SELECT `integer_unindexed_field` WHERE indexed_field > constant;
因为问题不是找到行,只是返回结果数据。