我在mysql上遇到大表的问题。
我在桌上有超过250万的数据。这是我的疑问。
select count(*) from location
where tagCode=24345
and xLocation >=81 and xLocation <=264
and yLocation >=356 and yLocation <=484
and locationDate >= '2017-03-08 00:00:01' and locationDate <= '2017-03-08 11:54:01';
我正在尝试获取该查询的计数。但它的行数超过1秒。这导致了问题。
我在表格中添加了索引。
ALTER TABLE location ADD INDEX(tagCode,xLocation,yLocation, locationDate);
如何提高性能?
答案 0 :(得分:0)
最后,我公司有1100万客户,所以一般情况下我们会根据每个月或每个地区创建一个表格。
在您的情况下,基于LocationDate,mabe您也可以每月创建一个表,例如:
coordinator_03_2017 coodinator_02_2017
所以你可以同时进行多个线程查询。
最后,您可以同时执行多个查询,将每个区间的couting分开,例如:
主题1 - query1:locationDate&gt; '2017-03-01 00:00:00' 线程2-查询2:locationDate&gt; '2017-02-01 00:00:00'和locationDate&lt; '2017-03-01 00:00:00' 线程N - 查询N
答案 1 :(得分:0)
x和y坐标很难索引。但是,这可能效果很好,至少对于给出的示例:
INDEX(tagCode, locationDate, xLocation, yLocation)
以下是理由:
tagCode
已使用=
进行测试; WHERE
中的任何此类测试都需要先来INDEX
。locationDate
似乎是最具选择性的,所以我把它放在旁边。SELECT
中所有所提到的列都在一个索引中。这样,可以在索引BTree中执行查询,而无需触及数据BTree。如果您有时会有较宽的日期范围,但x范围很窄,那么您添加的索引效果最佳。所以,保持它。并添加第三个:
INDEX(tagCode, yLocation, locationDate, xLocation)
这样,优化器可以在三个范围内进行选择,并且很可能选择最佳范围。
答案 2 :(得分:-1)
当你执行'&gt; ='是每个寄存器的两次比较时,请尝试'&gt;'。
另一件事:
locationDate >= '2017-03-08 00:00:01' and locationDate <= '2017-03-08 11:54:01'
我想象你想要一个位置直到'现在',如果我是正确的尝试只是较低的条件
locationDate >= '2017-03-08 00:00:01'
更重要的是,尝试创建像
这样的隔离索引locationDate DESC
tagCode ASC
xLocation ASC
yLocation ASC
如果xLocation和yLocation被声明为double,则更改为int,如Google坐标。
最后,尝试先排除条件,以消除更多不需要的行。