Mysql 使用索引优化sql查询
我有两张桌子,一张是会议桌,一张是在线桌Mysql 使用索引优化sql查询,mysql,sql,postgresql,mysqli,Mysql,Sql,Postgresql,Mysqli,我有两张桌子,一张是会议桌,一张是在线桌 | id | time | | 1 | 1413170771 | | 2 | 1413174398 | | 7 | 1413174567 | 在线是 | id | username | city | lat | lon | | 1 | Jon | Toronto | 45.46427
| id | time |
| 1 | 1413170771 |
| 2 | 1413174398 |
| 7 | 1413174567 |
在线是
| id | username | city | lat | lon |
| 1 | Jon | Toronto | 45.4642700 | 9.1895100 |
| 2 | Danny | Ottawa | 46.5645600 | 9.3456883 |
| 7 | Martin | Calgary | 46.6775339 | 9.5469944 |
询问
SELECT * , ( 6371 * acos( cos( radians( 45.4642700 ) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians( 9.1895100 ) ) + sin( radians( 45.4642700 ) ) * sin( radians( lat ) ) ) ) AS distance
FROM online AS o
INNER JOIN sessions AS s ON o.id = s.id
HAVING distance <2000
ORDER BY username DESC
SELECT*,(6371*acos(弧度(45.4642700))*cos(弧度(纬度))*cos(弧度(经度)-弧度(9.1895100))+sin(弧度(45.4642700))*sin(弧度(纬度)))作为距离
从在线作为o
o.id=s.id上作为s的内部联接会话
距离假设您有以下表格
| id | time |
| 1 | 1413170771 |
| 2 | 1413174398 |
| 7 | 1413174567 |
在线更改为
| id | username | city | lat | lon | dist |
| 1 | Jon | Toronto | 45.4642700 | 9.1895100 | ........ |
| 2 | Danny | Ottawa | 46.5645600 | 9.3456883 | ........ |
| 7 | Martin | Calgary | 46.6775339 | 9.5469944 | ........ |
下面的问题是什么:
SELECT *
FROM session s, online o
WHERE s.dist < 2000
AND s.id = o.id
ORDER BY username DESC;
选择*
来自会话s,在线o
其中s.dist<2000
s.id=o.id
按用户名DESC订购;
为什么要优化此查询
?因为此查询被广泛使用,并且表中包含10.000行如果postgresql和mysql都有可能用于将来的迁移,如果不可能,我更喜欢mysql一个可能的优化是将距离直接插入表中,这样你就不必每次都重新校准了!我不能加距离,因为它总是不同的。在这种情况下,我必须计算马丁和丹尼和乔恩的距离