php - 如何处理 mysql 和 laravel 中的数百万条记录
问题描述
如何在 MySQL 只读操作中处理超过 1000 万条记录。我有两张表,一张是company
保存公司的记录,即它的名称和它提供的服务,因此有 2 列,大约有 300 万条记录,另一张表employee
有大约 40 列和大约 1000 万条记录。当尝试获取数据时,即使是简单的查询,例如
Employee::paginate(100);
//In terms of mysql it
//select count(*) as aggregate from 'employee';
//Select * from 'employee' limit 100 offset 0;
过去大约需要 30 秒,而现在则需要永远。
如果我想进行搜索,应用过滤器或想加入两个表company
,即employee
有时它会工作,有时它会崩溃并在 SQL 服务器日志中给出很多错误/警告。谁能告诉我如何才能更有效地处理大量记录而不会导致 SQL 服务器崩溃,尤其是在高流量时间期间。目前,我只有主键,即 id 和联合 id 被索引。
与在 SO 上进行的所有类似查询相比,这是一种重复的帖子,但这些对我没有多大帮助。
我在 SO 上关注的问题
解决方案
进行以下更改:
partitioning
根据您的需要在您的数据库中使用。(例如如何按日期时间列对表进行分区?)- 使用
simplePaginate
方法而不是paginate
. 它不查询计数。( https://laravel.com/docs/5.7/pagination ) - 尝试改进您的
indexing
. 它影响。(谷歌:mysql索引最佳实践) - 如果您需要行数,请使用
caching
驱动程序(例如redis
)
推荐阅读
- php - 如何使用 css 为 php 迭代值设置样式表
- flutter - 如何将容器/图像的旋转和大小设置为全屏(手动纵向到横向)
- spring-boot - Spring Batch/Data JPA 应用程序在调用 JPA 存储库(save、saveAll)方法时未将数据持久化/保存到 Postgres 数据库
- excel - excel从单元格中提取每个单词并存储到单独的列中
- function - 为什么调用未定义的函数不会产生编译器错误并在 C 中产生链接器错误?
- html - 边界过渡在右边工作,但不是在左边
- jquery - 如何在 IIS / Project 中禁用自动 HTTPS 重定向
- azure - 用于从 ACR 查询 2 个不同构建版本的 Microsoft Azure CLI 命令
- oracle-nosql - Oracle NoSQL 表创建表时缺少“)”错误
- javascript - html角度打字稿上的过滤数组