mysql - 根据用户ID拆分数据库

标签 mysql query-optimization

我有一个 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/

相关文章:

mysql - 在 mysql 8 json 中按值计算数据

MySQL:如果在第二个表中找到匹配的 id 并添加缺少的内容,如何在第一个表中获取 "overwrite"数据

mysql - 优化子选择搜索查询

mysql - 为什么索引不适用于非唯一的日期时间列?

sql - 经典 SQL Server 操作

mysql - 如何将这两个sql合并为一个

使用 BEGIN 和 START TRANSACTION 时 MySQL AUTOCOMMIT 状态

java - JPQL 查询不起作用

postgresql - 大表查询的第一次调用出奇慢

sql - 与字符串相比,Mysql 在where 子句中使用数字是否更快?