我正在尝试合并两个表,条件是第一行中的行的值大于第二个表中的行。或者在代码中:
select * from Computers join Locations
ON Computers.ip_number > Locations.ipLower;
所引用的所有列(ip_number和ipLower)都是各自表中具有非常高基数的索引。但是,在语句上调用explain表示调用中没有使用索引。如何强制MySQL在连接语句中使用索引?
其他信息: 我使用的是MySQL版本5.6.17。如果连接条件是相等而不是大于,则查询正确使用索引。索引是二叉树类型。
编辑:引用的ip_number变量是一个整数,它是从IP地址而不是IP地址本身派生的。
答案 0 :(得分:0)
MySQL在查询计划程序判断通过这样做可以获得性能时使用索引。
在这种情况下,它没有作出判断就不足为奇了;根据您的ON
条件,您的第一个表格中的每一行都会加入到您的第二个表格的很多行中。
在您的应用程序中有一个有意义的查询之前,不要担心查询计划程序会使用哪些索引。目前尚不清楚你所展示的那个是否合理。它的结果集非常大。
此查询可能更有意义。它也可能对Computers.ip_number
上的索引使用范围扫描。
select *
from Computers
join Locations ON Computers.ip_number BETWEEN Locations.ipLower AND Locations.ipLupper
但是,您可能应该在结果集中枚举您想要的列,如果您想要体面的表现,请避免使用SELECT *
。
另外,请不要忘记点分四元组192.168.167.66
的IP地址不能合理整理。也就是说,使用<
或BETWEEN
等不等式来比较它们并不能真正起作用。