[英]In MySQL is it best practice to wrap LOCK TABLES calls in a try catch?
[英]MySQL - Best practice to cross two tables
我有两张桌子。 每个人都有大约50K记录。 两者都有一个共同的领域。 我想要公共字段匹配的两个表的记录。 所以我使用以下SQL代码。 问题是查询现在已经运行了20分钟而且什么也没发生。 对我来说,这花了很多时间似乎很奇怪。 我想知道是否有更好的方法来实现我的目标。 提前感谢您的回复。
我的SQL代码:
Select * from tableOne T1, tableTwo T2
Where T1.name = T2.name
顺便说一句,我对php解决方案开放(循环或其他任何东西,如果它更好......)
两件事情:
您需要确保两个表中的name列都有索引。 否则,查询将必须扫描每个表的每一行以查找匹配项。
理想情况下,索引应包含要在查询中选择的“包含列”。 否则查询将无法完全使用索引,但必须返回到表并为每行手动获取其他列。 这意味着您应该考虑在查询中仅选择所需的列(而不是*),并将这些列作为包含的列添加到索引中。
尝试这个:
select *
from tableOne t1
inner join tableTwo t2 on t1.name = t2.name
虽然我怀疑这会有所作为,尝试不会受到伤害。 不建议使用from tableOne t1, tableTwo t2
,因为你隐式制作了一个笛卡尔积!
应该是一个内部联接,以从两个表中获取名称连接的行。
SELECT t1.*, t2.* FROM table1 t1 INNER JOIN table2 t2 ON t1.name = t2.name
MySQL内部联接 - 你在那里发生的事情 - 非常有效。 50K的记录根本不是很多,即使是一对有几百万个条目的表,也只有20分钟。 尝试重新启动查询,或只是重新启动整个Web服务器。 查询本身如果正常(尽管最好指定您想要的每个表中的哪些列,即使您希望除了一列之外的每一列)。 如果没有索引,添加索引也是一个好主意。
你桌子的存储引擎是什么? 如果它是InnoDB,您需要在这两个表之间设置一个外键 - 这肯定会解决您的性能问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.