MySQL索引优化

时间:2016-04-13 06:29:36

标签: mysql indexing

我有一个大查询,其中包含使用连接和WHERE CLAUSES查询的不同表格。

根据我的理解,最好的索引是查看 WHERE CLAUSE 并将其添加为索引

select name from Table WHERE name = 'John'

我们在“名称”字段上有一个索引。

如果子句如下所示,我们如何确定最佳索引:

WHERE table1.field = 'x' and table2.field = 'y' etc...

当然,查询比这复杂得多,只是想知道如何继续,如果你们有更好的想法。

3 个答案:

答案 0 :(得分:0)

多个表没有单个索引这样的东西。您可以做的第一件事是在field上创建table2的索引,在field上为{{1}}创建另一个索引。如果这仍然不够快,根据您的数据库架构,您可以设置外键。

最后,您可以创建一个包含两个表中数据的视图,然后索引该视图。视图的优点是预先连接数据,可能使查询更快。

答案 1 :(得分:0)

如果条款如下所示,我们如何确定最佳索引:

WHERE table1.field = 'x' and table2.field = 'y' etc...

首先,当您使用2个表的连接时,应该对连接字段建立索引,为了获得更好的性能,这些字段应该是整数类型。

现在尝试检查哪个条件正在过滤更多数据意味着减少行并尝试在该字段上创建索引或在多个字段上创建复合索引(确保字段应该位于索引中最多的位置,这会过滤更多数据)但索引大小不应该增加太多。

通常(并非总是)一个表使用单个索引,因此当您从多个表中过滤数据时,如果您通过这些字段获得足够的数据过滤,则可以在两个表列上创建索引。

在看到您的实际查询后,任何人都可以提供更好的建议。

答案 2 :(得分:0)

SELECT ...
    FROM tA
    JOIN tB WHERE tA.x = tB.y
    WHERE tA.name = 'foo'
      AND tB.name = 'bar'

请求

tA: INDEX(name, x)
tB: INDEX(name, y)

另一方面:

SELECT ...
    FROM tA
    JOIN tB WHERE tA.name = tB.name

两个表都需要INDEX(name)

如果name是每个表上的PRIMARY KEY,则这些索引是多余的,不应添加。

相关问题