Mysql 解释说明查询很糟糕(它不使用单个键),但我使用的是limit1。这是个问题吗?

Mysql 解释说明查询很糟糕(它不使用单个键),但我使用的是limit1。这是个问题吗?,mysql,optimization,indexing,explain,Mysql,Optimization,Indexing,Explain,explain命令用于查询: explain SELECT * FROM leituras WHERE categorias_id=75 AND textos_id=190304 AND cookie='3f203349ce5ad3c67770ebc882927646' AND endereco_ip='127.0.0.1' LIMIT 1 结果是: id select_type table type possible_keys key

explain命令用于查询:

explain SELECT * FROM leituras 
WHERE categorias_id=75 AND 
textos_id=190304 AND 
cookie='3f203349ce5ad3c67770ebc882927646' AND 
endereco_ip='127.0.0.1' 
LIMIT 1
结果是:

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra       
1      SIMPLE          leituras  ALL      (null)            (null)  (null)      (null)  1022597  Using where 

在桌子上加几把钥匙会有什么不同吗?即使查询总是只返回一行。

它仍然必须对表进行线性搜索,直到找到那一行。因此,添加索引可以显著提高性能。

它仍然需要对表进行线性搜索,直到找到一行。因此,添加索引可以显著提高性能。

回答您的问题,是的。您应该在where子句中出现的列上添加必要的索引,谢谢@Col.shrapanel,在本例中为categorias_id、textos_id、cookie和endereco_ip


如果您总是使用WHERE子句中的相同3列执行查询,则一次添加包含这3列的索引可能比添加单个索引更有益。

在回答您的问题时,是的。您应该在where子句中出现的列上添加必要的索引,谢谢@Col.shrapanel,在本例中为categorias_id、textos_id、cookie和endereco_ip


如果总是在WHERE子句中使用相同的3列执行查询,则一次添加包含这3列的索引可能比添加单独的索引更为有益。

是的,如果只想返回一行,则索引更为重要

如果返回一半的行,并且数据库系统必须扫描整个表,那么效率仍然是50%

然而,如果您只想返回一行,并且数据库系统必须扫描1022597行才能找到您的行,那么您的效率是微乎其微的

限制1确实提供了一些效率,因为它在找到第一个匹配行时立即停止,但它显然必须扫描大量记录才能找到第一行

为WHERE子句中的每一列添加索引可使数据库系统避免扫描不符合条件的行。有了足够的索引,您将看到explain中的rows列将更接近返回的实际行数

使用覆盖WHERE子句中所有四列的复合索引可以实现更好的性能和更少的扫描,因为索引将提供完全覆盖。复合索引确实会占用大量内存并对插入性能产生负面影响,因此,如果大部分查询重复查找相同的列,或者很少插入记录,或者特定查询的速度对您来说非常重要,则可能只希望添加复合索引


另一种提高性能的方法是只返回所需的列,而不是使用SELECT*。如果在这四列上有一个复合索引,并且只返回这四列,那么数据库系统根本不需要访问记录。数据库系统可以从索引中获得所需的一切。

是的,当您只想返回一行时,索引更为重要

如果返回一半的行,并且数据库系统必须扫描整个表,那么效率仍然是50%

然而,如果您只想返回一行,并且数据库系统必须扫描1022597行才能找到您的行,那么您的效率是微乎其微的

限制1确实提供了一些效率,因为它在找到第一个匹配行时立即停止,但它显然必须扫描大量记录才能找到第一行

为WHERE子句中的每一列添加索引可使数据库系统避免扫描不符合条件的行。有了足够的索引,您将看到explain中的rows列将更接近返回的实际行数

使用覆盖WHERE子句中所有四列的复合索引可以实现更好的性能和更少的扫描,因为索引将提供完全覆盖。复合索引确实会占用大量内存并对插入性能产生负面影响,因此,如果大部分查询重复查找相同的列,或者很少插入记录,或者特定查询的速度对您来说非常重要,则可能只希望添加复合索引


另一种提高性能的方法是只返回所需的列,而不是使用SELECT*。如果在这四列上有一个复合索引,并且只返回这四列,那么数据库系统根本不需要访问记录。数据库系统可以从索引中获得所需的一切。

谢谢你!我将添加索引以提高查询性能。谢谢你!我将添加索引以提高查询性能。