我有一个 500 万行的数据库,它在增长,并且越来越难对其进行操作。
将表拆分为 10 个表(v0_table、v1_table ... v9_table)是否是个好主意,其中数字 (v*) 是用户 ID 的第一个数字?
在我的例子中,用户的 ID 不是自动递增的,因此它将对这 10 个表中的数据进行均匀排序。
问题是我从来没有做过类似的事情....
任何人都可以发现任何缺点吗?
编辑:
如果您能帮助我调整结构或查询,我将不胜感激。 所以最慢的查询是以下查询:
SELECT logos.user,
logos.date,
logos.level,
logos.title,
Count(guesses.id),
Sum(guesses.points)
FROM logos
LEFT JOIN guesses
ON guesses.user = '".$user['uid']."'
AND guesses.done = '1'
AND guesses.logo = logos.id
WHERE open = '1'
GROUP BY level
Where猜测表:
+--------+------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| logo | int(11) | NO | MUL | NULL | |
| user | int(11) | NO | MUL | NULL | |
| date | timestamp | NO | | CURRENT_TIMESTAMP | |
| points | int(4) | YES | MUL | 100 | |
| done | tinyint(1) | NO | MUL | 0 | |
+--------+------------+------+-----+-------------------+----------------+
标志表:
+-------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| img | varchar(222) | NO | MUL | NULL | |
| level | int(3) | NO | MUL | NULL | |
| date | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
| user | int(11) | NO | MUL | NULL | |
| open | tinyint(1) | NO | MUL | 0 | |
+-------+--------------+------+-----+-------------------+----------------+
解释:
+----+-------------+---------+------+----------------+------+---------+-------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+----------------+------+---------+-------+------+----------------------------------------------+
| 1 | SIMPLE | logos | ref | open | open | 1 | const | 521 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | guesses | ref | done,user,logo | user | 4 | const | 87 | |
+----+-------------+---------+------+----------------+------+---------+-------+------+----------------------------------------------+
最佳答案
您的问题不是您的数据太多,而是这些数据没有正确编入索引。尝试添加索引:
CREATE INDEX open_level ON logos(open, level)
这应该消除 Using temporary;在 Logo 上使用文件排序。
基本上,您需要在该表上为该查询创建一个索引以涵盖两件事:open - 对于 WHERE open = '1'
和 level - 对于按此顺序的GROUP BY level
,因为 MySQL 将首先按 open 进行过滤,然后按 level 对结果进行分组(隐式排序由它在过程中)。
关于mysql - 根据用户ID拆分数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11093039/