解释说明查询是可怕的(它不使用一个单一的键),但我使用极限1.这是一个问题吗?与查询
的解释命令:解释说明查询是可怕的(它不使用一个单一的键),但我使用极限1.这是一个问题吗?与查询
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
请问这有什么区别添加在桌子上某些键?即使该查询将始终只返回一行。
是的,当您只想返回一行时,索引就显得尤为重要。
如果您要返回一半行并且您的数据库系统必须扫描整个表,那么效率仍然是50%。
但是,如果您只想返回一行,并且您的数据库系统必须扫描1022597行才能找到您的行,那么效率很小。
LIMIT 1
确实提供了一些效率,因为只要找到第一个匹配行就会停下来,但显然它必须扫描大量记录才能找到第一行。
为您的WHERE
子句中的每个列添加索引可以使您的数据库系统避免扫描不符合条件的行。使用足够的索引,您会看到解释中的rows列将更接近实际返回的行数。
使用涵盖您的WHERE
子句中所有四列的复合索引可以实现更好的性能和更少的扫描,因为索引将提供全面覆盖。复合索引确实占用了大量内存并对插入性能产生了负面影响,所以如果大部分查询在同一列上重复查找,或者很少插入记录,或者这对你来说对于那个特别的查询很快就很重要。
提高性能的另一种方法是仅返回所需的列而不是使用SELECT *
。如果你在这四列上有一个复合索引,而你只返回那四列,那么你的数据库系统根本就不需要打你的记录。数据库系统可以从索引中获得所需的一切。
它仍然必须对表进行线性搜索,直到找到一行。所以添加索引可以显着提高性能。
回答你的问题,是的。您应在必要时添加索引(谢谢@ Col.Shrapnel)在WHERE
子句中出现的列上 - 在这种情况下,categorias_id
,textos_id
,cookie
和endereco_ip
。
如果您始终使用WHERE
子句中的相同3列执行查询,则可以一次添加包含3列的索引,而不是添加单个索引。
不是“尽可能”,但在必要的地方 – 2010-05-05 12:14:55
@ Col.Shrapnel - 是的,好点:-) – richsage 2010-05-05 12:16:03
谢谢你的男人!我将添加索引以改善查询性能。 – Ricardo 2010-05-05 16:09:36