我需要从两个表中检索列,并且我使用了 INNER JOIN。但它在加载页面时会耗费大量时间。有没有更好更快的方法来实现同样的目标?
从 Pyalers P 中选择 P.Col1、P.Col2、P.Col3、P.Col4、P.Col5、C.Col1、C.Col2、C.Col3 在 C.Col1 = P.Col1 上连接客户 C,其中 P。 Col2 = 5
提前致谢。
我需要从两个表中检索列,并且我使用了 INNER JOIN。但它在加载页面时会耗费大量时间。有没有更好更快的方法来实现同样的目标?
从 Pyalers P 中选择 P.Col1、P.Col2、P.Col3、P.Col4、P.Col5、C.Col1、C.Col2、C.Col3 在 C.Col1 = P.Col1 上连接客户 C,其中 P。 Col2 = 5
提前致谢。
不知道你的 DDL,就没有办法说。
但从概念上讲这是可以的,只要确保你有正确的索引集。
例如:(您的表名真的是“Pyalers”吗?假设是“玩家”)
CREATE INDEX idx_players ON `players` (col1);
CREATE INDEX idx_customers ON `customers` (col1);
使用连接 2 个表所需的列。
您正在以正确的方式进行操作,但是如果您的表上没有正确列上的索引,那么对于任何大小的表都不会很快。Pyalers.col1 和 Customers.col1 是否都有索引?
向我们展示这些表是如何定义的。
确保您的表具有所需的索引...作为“经验法则”,用于搜索 ( 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
是防止重复值的索引。
建议:
只要有可能,索引所有相关的数字和日期字段(id、出生日期等)。避免在包含“双”值的字段上创建索引。
不要滥用索引,因为滥用会创建非常大的索引文件。
尖端:
如果您想查看查询将如何执行,可以使用以下EXPLAIN
语句:
解释选择 ,乙。从 a.myId = b.otherId 上的内部连接 b
该指令将向您显示查询的执行计划。如果在最后一列中看到“文件排序”或“使用临时”,您可能(只是可能)需要额外的索引(请注意,如果您使用GROUP BY
,您几乎总是会收到“使用临时”消息)
希望这对你有帮助