MySQL 执行查询太慢

标签 mysql performance

我有一个包含超过 2000 万行的表“user_values”。 表格是这样的:

id | user_id |      scan_date      | value | category |      user_date      | 

1  |    1    | 2016-12-10 10:10:10 |  10   |    1     | 2016-01-05 11:11:11 | 
2  |    2    | 2016-12-10 10:10:10 |  14   |    2     | 2016-02-06 12:12:12 | 
3  |    3    | 2016-12-10 10:10:10 |  15   |    2     | 2016-03-07 13:13:13 | 
4  |    1    | 2016-12-10 12:10:10 |  11   |    1     | 2016-01-05 10:10:10 | 
5  |    2    | 2016-12-10 12:10:10 |  13   |    2     | 2016-02-06 12:12:12 | 
6  |    3    | 2016-12-10 12:10:10 |  17   |    2     | 2016-03-07 13:13:13 | 
7  |    1    | 2016-12-10 14:10:10 |  13   |    1     | 2016-01-05 11:11:11 | 
8  |    2    | 2016-12-10 14:10:10 |  15   |    2     | 2016-02-06 12:12:12 | 
9  |    3    | 2016-12-10 14:10:10 |  16   |    2     | 2016-03-07 13:13:13 | 
10 |    1    | 2016-12-10 16:10:10 |  18   |    1     | 2016-01-05 11:11:11 | 
11 |    2    | 2016-12-10 16:10:10 |  13   |    2     | 2016-02-06 12:12:12 | 
12 |    3    | 2016-12-10 16:10:10 |  14   |    2     | 2016-03-07 13:13:13 | 

“scan_date”是写入该行的时间。

Mysql 每天在该表中写入大约 100 万行。

我有一个 SELECT QUERY 来获取每个用户的最后一个“值”:

SELECT * FROM (SELECT * FROM user_values 
        WHERE
        category =  '2' AND
        user_date      >=  '2016-01-16' AND
        user_date      <= '2016-12-15 10:34:35' 
        ORDER BY id DESC LIMIT 999999999) as user_values
        WHERE 
        category = '2' AND
        user_date      >=  '2016-01-16' AND
        user_date      <= '2016-12-15 10:34:35' 
        GROUP BY user_values.user_id

查询速度比我发现的更快,但现在我收到错误“MySQL 服务器已消失”,因为查询太慢。

我还尝试创建分区:通过哈希(id)创建100个分区,但我没有解决,我认为现在速度较慢。

有人建议我购买一台功能强大的服务器,但我认为我没有解决问题。 有人建议我创建一个 mysql“集群”主/从。

您还有其他建议或更好的查询或更好的 mysql 配置吗?

最佳答案

mysqli 中的数据库获取最后的插入 ID

$sql = "YOUR INSERT QUERY";
if ($conn->query($sql) === TRUE) {
    $last_id = $conn->insert_id;
}

使用最后一个用户 ID 获取值(value)

$sql2 = "SELECT `value` FROM tablename where `id`=$last_id ; 
$value = $conn->query($sql2);
echo "Value of last user is $value"

通过 PDO 获取最后插入 ID

    $sql = "YOUR INSERT QUERY";
    $conn->exec($sql);
    $last_id = $conn->lastInsertId();

使用最后一个用户 ID 获取值(value)

$sql2 = "SELECT `value` FROM tablename where `id`=$last_id ; 
$value = $conn->query($sql2);
echo "Value of last user is $value"

关于MySQL 执行查询太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41280827/

相关文章:

mysql - 如何在单独的文件中使用 DB 设置连接多个数据库(hsqldb、mysql)

c++ - 如何优化这个将输入位转换为单词的简单函数?

mysql - 我需要一个好的MySQL数据库结构

mysql - 对于在 AWS 上运行的小型电子商务站点,MySQL 是否 catch 了 SQL Server Express(特别是存储过程)?

mysql - Laravel 5.5 根据 session 选择用户,角色如下

sql - JOINS,EXISTS或IN中哪个更好?关于SQL的几个问题

c# - 提高 C# 套接字性能

python - 将图像文件读/写为 numpy 数组的最有效方法

mysql - Solr 与 MySQL 的自动完成性能对比

MySQL通过在左侧应用date()函数来优化查询