MySQL需要建议使用数据库结构存储大数据

时间:2016-03-13 13:46:51

标签: php mysql

我需要存储我网站的统计信息。

我需要这些

1: I can query how many hits in day, week month, last month, etc based on a category.
2: Then I can sort stats according to countries, day, pages etc.

我知道这样做的方法

表all_stats

| category |  page_url  | country |    date     |.......
|    x     | index.php  |    US   |  timestamp  |.......
|    y     | index2.php |    UK   |  timestamp  |.......
.
.

然后我可以查询为

SELECT * FROM all_stats WHERE category=x AND date<=today AND date>=last week

This works fine but problem with this is 
as database increase query takes a lot of time to execute.

要解决查询速度存储每日国家/地区的统计数据,请在上表中与256个国家/地区的其他表格等

表daily_stats

| category |  page_url  |   US    |    UK   |.......|  date |
|    x     | index.php  |   1000  |  1500   |.......|   1st |
|    y     | index2.php |   1500  |  2000   |.......|   2nd |
.
.

然后我可以查询

SELECT 
SUM(US) AS us
SUM(Uk) AS uk
.
.  //all 256 countries and island etc
.
.
WHERE category=x AND date<=today AND date>=last week

But this will be a big table with many columns

我看到的另一个问题是

创建表smart_stats

| category |  page_url  |     country_array    .......|  date   |
|    x     | index.php  |   US=>1000, UK=1500  .......|  1st    |
|    y     | index2.php |   US=>1500, UK=2000  .......|  2nd    |
.
.

This can be smart approach if I can add all country stats in some way

请建议一种方法,使表格smart_stats country_array可以查询,我可以以任何方式排序

或者建议你认为这是最好的方法

由于

2 个答案:

答案 0 :(得分:2)

你的all_stats结构可能没什么问题。这个查询:

SELECT *
FROM all_stats
WHERE category = x AND date <= today AND date >= last week

可以从索引中受益。我实际上会推荐两个:(category, date)(date)。第一个应该大大加快查询速度。第二个处理不寻找特定类别的查询。

如果您通常同时想要所有国家/地区,您可能会发现转动国家/地区有所帮助。它实际上减少了表格的绝对大小以及行数 - 如果每天都代表所有或大多数国家。在查询具有数百列的表时,以及为新国家/地区维护表时会出现问题(并且MySQL对表中的列数有限制,因此适用于各国的可能无法在省/州工作/城市层面。)

答案 1 :(得分:1)

您可以添加以下索引:

ALTER TABLE `all_stats` 
ADD INDEX `categoryDate` (`category` ASC, `date` ASC)  COMMENT '';