从多个表中检索记录的最快方法

时间:2012-06-01 18:13:26

标签: mysql performance inner-join

我需要从两个表中检索列,并且我使用了INNER JOIN。但是在加载页面时耗费了大量时间。是否有更好更快的方法来实现同样的目标?

  

从Pyalers P内部加入客户C选择P.Col1,P.Col2,P.Col3,P.Col4,P.Col5,C.Col1,C.Col2,C.Col3 C.Col1 = P.Col1其中P.Col2 = 5

先谢谢。

3 个答案:

答案 0 :(得分:0)

在不知道你的DDL的情况下,没有办法说出来。

但从概念上讲这是可以的,只要确保你有适当的索引集。

例如:(你的桌名真的是'Pyalers'吗?假设'玩家')

CREATE INDEX idx_players ON `players` (col1);
CREATE INDEX idx_customers ON `customers` (col1);

使用加入2个表所需的列。

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

答案 1 :(得分:0)

您正在以正确的方式执行此操作,但如果您的表上没有正确列的索引,则对于任何大小的表都不会非常快。 Pyalers.col1和Customers.col1都有索引吗?

向我们展示如何定义表格。

答案 2 :(得分:0)

确保您的表具有所需的索引...作为“拇指规则”,用于搜索(WHERE)或数据连接(INNER JOINLEFT JOIN的每个字段,RIGHT JOIN)应编入索引。

示例:如果要创建表,可以在此时添加索引(请注意,表应始终具有主键):

CREATE TABLE myTable (
myId int unsigned not null,
someField varchar(50),
primary key (myId),
index someIdx(someField)
);

如果您的表已经存在,并且您想要添加索引,则需要使用ALTER语句:

ALTER TABLE myTable
ADD INDEX someIdx(someField),
ADD PRIMARY KEY (myId);

规则:

  1. 要定义索引,您最常为其提供唯一名称,并指定索引中包含的字段:INDEX myIndex(field1, field2, ...)

  2. 有不同类型的索引:PRIMARY KEY用于主键(很明显,是吧?); INDEX是一个'普通索引',仅用于加速搜索和连接操作; UNIQUE INDEX是防止重复值的索引。

  3. Recomendations:

    • 只要你可以,索引所有相关的数字和日期字段(ids,出生日期等)。避免在包含“double”值的字段上创建索引。

    • 不要滥用索引,因为滥用可能会创建非常大的索引文件。

    提示:

    • 如果您想查看查询的执行方式,可以使用EXPLAIN语句:

      在a.myId = b.otherId

    • 上从内部联接b中解析选择a。,b。

    该指令将向您显示查询的执行计划。如果在最后一列中您看到'文件排序'或'使用临时',您可能(可能)需要附加索引(请注意,如果您使用GROUP BY,您几乎总会得到'使用临时'消息)< / p>

    希望这能帮到你