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

标签 mysql

我有一个简单的 ISAM 表,大约 2.2GB,有 160 万条记录。出于这个问题的目的,查询是

SELECT 'one_unindexed_field' WHERE indexed_field > constant;

该表唯一不寻常的地方是它有 1 个大的未索引列 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 Community Server (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 

最佳答案

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

(indexed_field, 'one_unindexed_field')`

但问题是您没有说明该查询需要多少时间。 Brign 一个大的 varchar 字段总是比一个整数慢,因为数据会更大。

因此,如果像这样的查询有效,那么您无能为力。

SELECT `integer_unindexed_field` WHERE indexed_field > constant;

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

关于mysql - 如何在具有大型 VARCHAR 字段的表上加速 SELECT 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43524716/

相关文章:

mysql - EXISTS vs IN - 哪一个在MySQL 5.5和MySQL 5.7中更好?

mysql - 使用 MySQL 的关系模式

php - 如何为客户创建登录?

mysql - 根据 Null 或 Not Null 值删除重复项

mysql - 如果我从 Windows 7 的注册表中更改 ODBC DSN,我在 MS Access 中的链接表是否需要刷新?

mysql - 我可以添加多个与 Entity Framework 相互引用的新项目而不先保存上下文吗?

mysql - 在 MySQL/Oracle 数据库中切换 bool 值

php - 如果未找到搜索的某个变量,如何删除 SQL 查询中具有相同值的行?

Mysql更新行以删除int辅助列间隙

php - SELECT where row value 包含字符串 MySQL