第一场比赛后停止MySQL

第一场比赛后停止MySQL,mysql,Mysql,我注意到在查询末尾添加limit1并不会减少执行时间。我有几千条记录和一个简单的查询。第一场比赛后我如何让MySQL停止 例如,这两个查询都需要大约半秒钟的时间: SELECT id,content FROM links WHERE LENGTH(content)<500 ORDER BY likes SELECT id,content FROM links WHERE LENGTH(content)<500 ORDER BY likes LIMIT 1 两个查询在运行时的差异取

我注意到在查询末尾添加limit1并不会减少执行时间。我有几千条记录和一个简单的查询。第一场比赛后我如何让MySQL停止

例如,这两个查询都需要大约半秒钟的时间:

SELECT id,content FROM links WHERE LENGTH(content)<500 ORDER BY likes

SELECT id,content FROM links WHERE LENGTH(content)<500 ORDER BY likes LIMIT 1

两个查询在运行时的差异取决于实际数据

有几种可能的情况:


有许多记录使用LENGTHcontent在自动表扫描中对数据结果调用函数,这些记录无法索引。如果性能是一个问题,您可以创建一个派生列,在该列中预先保存此值:

ALTER TABLE links ADD COLUMN content_length INT
UPDATE links SET content_length=LENGTH(content)
ALTER TABLE links ADD INDEX idx_content_length (content_length)

一旦像这样进行了非规范化并正确地执行,您将能够更快地运行查询。请记住,每次添加记录时都必须填充内容长度。

请注意,不按顺序限制没有多大意义-除非您真正感兴趣的是表中是否存在概念。使用EXPLAIN SELECT*FROM tbl获取执行计划,其中LengthCol表中有多少记录在500以下角色?上面有多少?查找“第一条”记录所需的时间可能与查找所有记录所需的时间相似。极端情况下,只有一条记录符合最后一条被扫描的条件。。。请注意,不能使用索引查找满足长度条件的记录。@Galz大约66%的记录的长度小于500个字符。当然,在您的示例中,这没有明显的区别,因为ORDER BY和LIMIT的组合要求首先选择与WHERE条件匹配的所有记录,因此,它们可以被带到指定的顺序中–限制只会自然地在之后应用。添加一个索引暂时修复了它。然而,我已经在表中有了几个更重要的索引,我不想再添加了。为什么这个查询不起作用:SELECT*FROM SELECT id,content FROM links ORDER BY likes DESC t WHERELENGTHcontent@Linksku创建有序表需要进行完整的表扫描-这是花费大部分时间的。
ALTER TABLE links ADD COLUMN content_length INT
UPDATE links SET content_length=LENGTH(content)
ALTER TABLE links ADD INDEX idx_content_length (content_length)