Php MySQL部分选择(性能问题)
我有一个超过300000行的表(表的总大小为600mb+) 表上的行是事件的记录,每个行都有一个时间戳(历元) 要对未过期事件执行查询,我必须使用Php MySQL部分选择(性能问题),php,mysql,sql,Php,Mysql,Sql,我有一个超过300000行的表(表的总大小为600mb+) 表上的行是事件的记录,每个行都有一个时间戳(历元) 要对未过期事件执行查询,我必须使用WHERE epoch>currentepoch,但执行此类查询需要5-8秒。(事实上,未过期事件的数量不超过6000) 因此,对于未过期事件的简单计数,我的查询需要5-8秒 有什么解决办法吗?我可以查询表的一部分吗?(比如忽略过期事件,让MySQL根本不去处理它们) 注:发动机为MyISAM 注2:我无法规范化该表,因为信息是描述等内容 TLDR;从
WHERE epoch>currentepoch
,但执行此类查询需要5-8秒。(事实上,未过期事件的数量不超过6000)
因此,对于未过期事件的简单计数,我的查询需要5-8秒
有什么解决办法吗?我可以查询表的一部分吗?(比如忽略过期事件,让MySQL根本不去处理它们)
注:发动机为MyISAM
注2:我无法规范化该表,因为信息是描述等内容
TLDR;从一个300000行的表中计算6000行需要5-8秒,解决方案是什么
谢谢
更新:谢谢大家。添加索引后,查询将在不到半秒钟的时间内运行。感谢您的帮助。为此,有一件事叫做
CREATE INDEX epoch ON tablename (epoch)
有一件事就是为了这个目的
CREATE INDEX epoch ON tablename (epoch)
应用于
where
子句中使用的列始终是一个明智的想法。应用于where
子句中使用的列始终是一个明智的想法。如果从所有其他答案中还看不出这一点,您应该在epoch
列上创建一个B树
另外,如果您还不熟悉,您应该熟悉。如果从所有其他答案中还看不出,您应该在
历元
列上创建一个B树
另外,如果您还不熟悉,您应该熟悉。您基本上应该为您正在WHERE子句上搜索的所有表字段创建单独的索引。组合索引(具有多个字段)应用于更复杂的查询,但请记住,索引会占用数据库空间和资源 我不确定是否可以在myISAM表上创建索引-我对MySQL不是很了解,因为我更喜欢真实的数据库;-)-但如果不能,则应将相关表转换为InnoDB格式,然后创建所需的索引 顺便说一句,您提到您的表是不可规范化的-这不可能是对的,每个表在某种程度上都是可规范化的,这取决于您想要投入的时间/精力。 有时,随着数据越来越大,这是唯一的办法,但300000行实际上并不多
祝你好运 您基本上应该为在WHERE子句上搜索的所有表字段创建单独的索引。组合索引(具有多个字段)应用于更复杂的查询,但请记住,索引会占用数据库空间和资源 我不确定是否可以在myISAM表上创建索引-我对MySQL不是很了解,因为我更喜欢真实的数据库;-)-但如果不能,则应将相关表转换为InnoDB格式,然后创建所需的索引 顺便说一句,您提到您的表是不可规范化的-这不可能是对的,每个表在某种程度上都是可规范化的,这取决于您想要投入的时间/精力。 有时,随着数据越来越大,这是唯一的办法,但300000行实际上并不多
祝你好运 如前所述,在currentepoch上使用索引。它允许表更快地搜索该列
另一种解决方案是通过cronjob将事件标记为过期,用一个值更新所有过期事件,每分钟运行一次,只搜索该值,而不是使用前面提到的
,在currentepoch上使用索引。它允许表更快地搜索该列
另一种解决方案是通过cronjob将事件标记为过期,用一个值更新所有过期事件,每分钟运行一次,只需搜索该值,而不是使用
在历元列上有索引吗?这些历元
和当前历元
是否都是表中的字段?字段是否为MySQL日期(时间)类型,它们是否有组合索引?请发布CREATETABLE语句和您的查询。如果只有epoch
是一个字段,您有索引吗?您是否在历元列上有索引?这些epoch
和currentepoch
是否都是表中的字段?字段是否为MySQL日期(时间)类型,它们是否有组合索引?请发布CREATETABLE语句和您的查询。如果只有epoch
是一个字段,您有索引吗?也可能对你有用,我不确定你能不能在myISAM表上创建索引
我更喜欢超现实的数据库:)我也想知道,是否[I]ndexed[S]sequential[A]access[m]method文件是[I]ndexed;POMG,我不确定您是否可以在myISAM表上创建索引
我更喜欢超现实数据库:)我也想知道[I]ndex[S]sequential[A]access[m]method文件是否[I]ndex;P