我有一个45 got的表,它有76m行和150列。
当我运行以下简单查询时:
SELECT count(*) FROM my_table WHERE `column_of_interest` IS NOT NULL返回结果需要850秒。我可以看到mysql进程在整个时间以~40 at /秒的速度读取磁盘。这意味着它会遍历存储在表中的几乎整个数据,尽管它只需要知道一个列。
我假设,如果它能够具体地读取该列的数据,它将以大于100倍的速度读取(因为有150列)。
是否有任何方法允许MySQL读取单个列?下表提供了资料。
谢谢你的反馈,
万事如意,
伊曼纽尔
使用对我得到的查询的解释:
'1','SIMPLE','table_name','ALL',NULL,'76628126',‘使用where’
引擎是InnoDB
我在列中使用INT / FLOAT / ENUM / CHAR / VARCHAR(1)到VARCHAR(30)类型
发布于 2015-06-30 13:03:09
在column_of_interest列上创建索引。
CREATE INDEX my_tab_col_of_int ON my_table (column_of_interest);首先需要一段时间才能建立这个索引。在此期间,my_table将不可用。
在此之后,您所显示的查询将运行得更快。这是因为索引的组织方式允许快速查询。读这个:http://use-the-index-luke.com/
注意到,在大多数情况下,COUNT(colname)比COUNT(*)慢。后一个表达式只需知道表中有多少行。前者必须查看colname以排除空值。要花更长的时间。
发布于 2015-06-30 12:31:33
尝试在没有缓存的情况下进行选择,只获取所需的列,例如:
SELECT SQL_NO_CACHE count(column_of_interest) FROM my_table WHERE `column_of_interest` IS NOT NULL来源:https://dev.mysql.com/doc/refman/5.0/en/query-cache-in-select.html
发布于 2015-06-30 15:03:42
有“列存储”可以单独存储每一列(某种程度上)。MySQL没有这样的引擎。InfoBright是这样一个第三方引擎。而且,是的,在这样的引擎中,您的查询(即使没有索引)可能会快100倍。
我同意奥利的意见。但是,在5.6中(在某些情况下),可以在不锁定表的情况下添加索引。而且,pt-online-schema-update也可以这样做。
此外,包含column_of_interest的任何现有复合索引都将被使用。你的解释暗示根本没有。
编辑(更多注释,基于标题)
如果未缓存45 of,则时间与读取45 of磁盘成正比。如果全部缓存,则时间与76M (行)成正比--必须访问每一行,然后必须提取所讨论的一列。可能有一个很小的捷径,因为您正在测试NULL。对于第100列的获取速度是否比第1列慢的问题,存在一些争论;但如果有的话,差别是很小的。
缓存与非缓存的速度比通常为1:10。
https://stackoverflow.com/questions/31138280
复制相似问题