我很好奇。
我有商务桌。现在我想我将不得不创建一个单独的表,位置表。那个单独的表应该是myisam。
但我为什么要这样做?
为什么innodb不能存储积分?
database.tablebusiness query: { LongitudeLatitude: { $nearSphere: [ 106.772835, -6.186753 ], $maxDistance: 0.04498373205078301 }, Prominent: { $gte: 15 }, indexContents: { $all: [ /^aru/, /^op/ ] } } ntoreturn:20 ntoskip:80 nscanned:100 nreturned:20 reslen:1147 1927ms
Run Code Online (Sandbox Code Playgroud)
似乎 ntoreturn 意味着要返回的数字。ntoskip 是要跳过的数字。nscanned 似乎是 2 的总和。
什么是reslen?
我搜索谷歌没有答案。什么网站解释什么是reslen?
MySQL 支持空间索引。然而,空间索引所能做的就是在一个框中找到点。它不能做一些花哨的事情,比如找到最近的 1000 点等。
我想,而且我不知道我哪里出错了,简单地在框中找到点很容易——只需做约束:
x < xmax and x > xmin and y < ymax and y > ymin
Run Code Online (Sandbox Code Playgroud)
是的,这些是使用至少 2 列的 4 个约束。结果是当有 160 万行时,事情变得太慢了。
但为什么?x 和 y 已排序。复杂度应该是log(n)。然而,查询可能需要 60 秒。
使用空间索引通过一些子查询技巧将其缩短到 1 秒。
我错过了什么?为什么在查询中使用一堆约束需要时间?
即使没有花哨的算法,也应该很容易快速获得框中的分数。然而,我觉得O(n)至少应该是复杂的。
我试图在我的机器上重新安装 mysql,但它一直失败。每次失败时,它都会执行此锁定,并且该锁定和未来的努力将再次失败。
最后我决定做真正的全新安装
该过程在此处列出:http : //stuffthatspins.com/2011/01/08/ubuntu-10-x-completely-remove-and-clean-mysql-installation/
我不想丢失已经存在的数据。是的,它有备份,但我有点喜欢那里。
那么,我可以只 mv 内容 /etc/mysql 然后在我重新安装所有内容后将其复制回来吗?
我的程序员说这行不通
如果没有,我还应该知道什么?
我有点忘记 mysql 在哪里存储数据。我猜这是 ubuntu 的默认设置。
更新:我使用可用计算机在一些本地数据库上尝试过。Myisam 表被转移。但是 innodb 表没有。
另外http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file显示 innodb 不会通过复制文件那么容易地传输。我错过了什么吗?
另一个更新:答案是肯定的,我们可以。我们做到了:D
更新伙计们。
简短的回答是,我们可以。我的程序员刚刚做到了。关键是复制整个文件,实现innodb将数据库存储在一个大文件中。不知道为什么。
另一个答案更好,所以我选择了那个(我认为选择我自己的答案并不客观)。我只想分享它的工作原理。