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 

在桌子上添加一些键会有什么不同吗?即使查询总是只返回一行。

4

3 回答 3

3

回答你的问题,是的。您应该在必要时在子句中出现的列上添加索引(感谢@Col.ShrapnelWHERE ) ——在本例中为categorias_idtextos_idcookieendereco_ip

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

于 2010-05-05T12:14:08.693 回答
2

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

于 2010-05-05T12:13:14.653 回答
1

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

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

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

LIMIT 1确实提供了一些效率,因为它一旦找到第一个匹配行就停止,但它显然必须扫描大量记录才能找到第一行。

为子句中的每个列添加索引WHERE可以让您的数据库系统避免扫描与您的条件不匹配的行。有了足够的索引,您会看到说明中的 rows 列将更接近实际返回的行数。

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

Another way to improve performance is to return only the columns that you need rather than using SELECT *. If you had a compound index on those four columns, and you returned only those four columns, your database system wouldn't need to hit your records at all. The database system could get everything it needed right from the indexes.

于 2010-05-05T12:33:22.000 回答