如何加速具有大VARCHAR字段的表上的SELECT语句?

时间:2017-04-20 16:11:18

标签: mysql

我有一个简单的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 

1 个答案:

答案 0 :(得分:0)

如果要改进此查询,请尝试创建复合索引,以避免在找到匹配的行后查找表。

(indexed_field, 'one_unindexed_field')`

但问题是你不知道该查询花了多少时间。对于一个整数来说,一个大的varchar字段总是比较慢,因为数据会更大。

因此,如果像这样的查询工作,那么你可以做的更多。

SELECT `integer_unindexed_field` WHERE indexed_field > constant;

因为问题不是找到行,只是返回结果数据。