我需要从两个表中检索列,并且我使用了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
先谢谢。
答案 0 :(得分:0)
在不知道你的DDL的情况下,没有办法说出来。
但从概念上讲这是可以的,只要确保你有适当的索引集。
例如:(你的桌名真的是'Pyalers'吗?假设'玩家')
CREATE INDEX idx_players ON `players` (col1);
CREATE INDEX idx_customers ON `customers` (col1);
使用加入2个表所需的列。
答案 1 :(得分:0)
您正在以正确的方式执行此操作,但如果您的表上没有正确列的索引,则对于任何大小的表都不会非常快。 Pyalers.col1和Customers.col1都有索引吗?
向我们展示如何定义表格。
答案 2 :(得分:0)
确保您的表具有所需的索引...作为“拇指规则”,用于搜索(WHERE
)或数据连接(INNER JOIN
,LEFT 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);
规则:
要定义索引,您最常为其提供唯一名称,并指定索引中包含的字段:INDEX myIndex(field1, field2, ...)
有不同类型的索引:PRIMARY KEY
用于主键(很明显,是吧?); INDEX
是一个'普通索引',仅用于加速搜索和连接操作; UNIQUE INDEX
是防止重复值的索引。
Recomendations:
只要你可以,索引所有相关的数字和日期字段(ids,出生日期等)。避免在包含“double”值的字段上创建索引。
不要滥用索引,因为滥用可能会创建非常大的索引文件。
提示:
如果您想查看查询的执行方式,可以使用EXPLAIN
语句:
在a.myId = b.otherId
该指令将向您显示查询的执行计划。如果在最后一列中您看到'文件排序'或'使用临时',您可能(可能)需要附加索引(请注意,如果您使用GROUP BY
,您几乎总会得到'使用临时'消息)< / p>
希望这能帮到你