加快mySQL SELECT查询速度,第一次查询比下一次要长1000倍?

加快mySQL SELECT查询速度,第一次查询比下一次要长1000倍?,mysql,Mysql,我有一个简单的ISAM表,有160万条记录。典型的查询在3个索引列上有一个WHERE子句,并返回10000条左右的记录。为了这个问题的目的,我在做SELECT*,我在这里省略ORDERBY。该表唯一不寻常的地方是它有一个大的非数字列VARCHAR(8192) 对于我用于此问题的查询,第一次提交查询大约需要145秒,而后续提交大约需要2秒。该表在这种状态下毫无价值,因为我需要执行的真正查询在第一次提交时需要一个小时或更长时间。无论进行了多少磁盘I/O,这看起来都很荒谬。当我使用输入输出文件版本的查

我有一个简单的ISAM表,有160万条记录。典型的查询在3个索引列上有一个WHERE子句,并返回10000条左右的记录。为了这个问题的目的,我在做SELECT*,我在这里省略ORDERBY。该表唯一不寻常的地方是它有一个大的非数字列VARCHAR(8192)

对于我用于此问题的查询,第一次提交查询大约需要145秒,而后续提交大约需要2秒。该表在这种状态下毫无价值,因为我需要执行的真正查询在第一次提交时需要一个小时或更长时间。无论进行了多少磁盘I/O,这看起来都很荒谬。当我使用输入输出文件版本的查询时,mySQL可以在很短的时间内将大量文件写入磁盘

我怎样才能修理这张桌子

#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
答复问题:

表中约有220 GB 160万条记录

速度:不需要很快,只要快到足以避免在等待时因年老而死亡。。。5秒是可以接受的,现在需要2分钟

EXPLAIN返回的信息:

mysql> EXPLAIN SELECT /*+ MAX_EXECUTION_TIME(200000)*/ *  
FROM tbl_skews 
WHERE (skw_minute IN(43)) 
  AND (tday_date >= 42767 AND tday_date <= 42838) 
  AND (skw_days > -10 AND skw_days < 70);

 id     1

 select_type     SIMPLE          
 table       tbl_skews     
 partitions      NULL           
 type    ref      
 possible_keys      ndx_skews_tday_date,ndx_skews_skw_minute,ndx_skews_skw_days     
 key                     ndx_skews_skw_minute     
 key_len        2    
 ref        const     
 rows       35396    
 filtered   1.51    
 Extra           Using where 

您可以尝试使用索引。索引类似于主键,但在一个表中可以有多个索引

例如,如果我有以下查询

select * from users where email='christakos@gmail.com'
我必须为电子邮件列编制索引


您可以观看此视频以了解有关索引的更多信息

skw\u分钟、tday\u日期、skw\u天创建复合索引

create index my_idx on my_table(skw_minute, tday_date, skw_days);

第二个查询总是更快,因为它将从缓存中获取数据。性能问题应包括
EXPLAIN ANALYZE
和一些关于表大小、索引、当前时间性能、期望时间等的信息。
Slow
是一个相对术语,我们需要一个实际值进行比较。编辑问题是为了回答问题…编辑问题是为了使表定义更清晰。添加4个空格或选择文本,然后按control-k将其格式化为代码希望现在将其格式化为代码…确保您正在遵循列表中主要与innodb有关的步骤。。。我从innodb开始了这个项目,并转到了isam,因为innodb的性能比isam差得多(请记住,我只关心读,不关心写…我的理解是isam通常在这种情况下性能更好。)好吧,复合索引是一个很大的进步。。。我的测试查询时间从145秒增加到了3秒。我不明白为什么需要额外的索引。。。我以为我遵循的是“足够多的索引,而不是太多”的最佳实践。不幸的是,我每天需要运行的查询仍然需要90秒才能提取44000条记录。。。还有什么我能做的吗?我不明白,你测试查询在3秒内运行,但是你有一个不同的查询在90秒内运行??问题是什么??计划在哪里??您需要分析解释计划以理解查询并优化它。最佳实践就是解决问题的方法。如果需要一个索引,可以创建该索引。在这里检查MySQL索引这是完全相同的查询,只是具有更宽的日期范围和skw_minute IN(),具有7个值而不是1个值。。。直到现在我才可以运行它,因为它需要几个小时。谢谢你的提示链接,我会学习的。看起来我现在的问题和大的VARCHAR列有关,所以我会问一个新问题。。。谢谢胡安打破僵局。
create index my_idx on my_table(skw_minute, tday_date, skw_days);