首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL -*查询一列的时间*与表中的行数和列数成正比*?

MYSQL -*查询一列的时间*与表中的行数和列数成正比*?
EN

Stack Overflow用户
提问于 2015-06-30 12:25:46
回答 3查看 123关注 0票数 0

我有一个45 got的表,它有76m行和150列。

当我运行以下简单查询时:

代码语言:javascript
复制
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)类型

EN

回答 3

Stack Overflow用户

发布于 2015-06-30 13:03:09

column_of_interest列上创建索引。

代码语言:javascript
复制
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以排除空值。要花更长的时间。

票数 1
EN

Stack Overflow用户

发布于 2015-06-30 12:31:33

尝试在没有缓存的情况下进行选择,只获取所需的列,例如:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31138280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档