首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用like和join的缓慢数据库查询

使用like和join的缓慢数据库查询
EN

Stack Overflow用户
提问于 2022-11-13 21:56:57
回答 1查看 24关注 0票数 0

我已经创建了一个基于laminas和mezzio的php项目,其中包含一个MySQL数据库,用于stora媒体文件。只有1400个媒体文件时,搜索速度非常慢(搜索结果需要几秒钟)。

我的桌子是

用户

代码语言:javascript
复制
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_id` int(11) NOT NULL,
  `username` varchar(255) CHARACTER SET utf16 COLLATE utf16_unicode_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf16 COLLATE utf16_unicode_ci NOT NULL,
  `email` varchar(255) CHARACTER SET utf16 COLLATE utf16_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
);

角色

代码语言:javascript
复制
CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `access` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
);

媒体

代码语言:javascript
复制
CREATE TABLE `media` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `order` int(11) NOT NULL,
  `created_at` datetime NOT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `filename` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `is_private` int(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
);

media_keyword

代码语言:javascript
复制
CREATE TABLE `media_keyword` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `media_id` int(11) NOT NULL,
  `keyword` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
);

media_role

代码语言:javascript
复制
CREATE TABLE `media_role` (
  `media_id` int(11) NOT NULL,
  `role_id` int(11) NOT NULL,
  PRIMARY KEY (`media_id`,`role_id`)
);

我使用理论来创建查询,而follogwing查询用于搜索数据库中给定的搜索查询:

代码语言:javascript
复制
SELECT DISTINCT m.*, u.username 
FROM media AS m 
LEFT JOIN user AS u ON u.id = m.user_id 
LEFT JOIN media_keyword AS k ON k.media_id = m.id
LEFT JOIN media_role AS r ON m.id = r.media_id
WHERE (m.is_private = 0 OR (m.is_private = 1 AND m.user_id = :user_id))
AND (r.role_id = :role_id OR r.role_id IS NULL) 
AND (m.filename LIKE :search OR m.title LIKE :search OR k.keyword LIKE :search)
GROUP BY m.id
LIMIT :offset, :page_size

当我通过MySQL工作台直接查询数据库时,搜索查询大约需要7-14秒。如果在PHP / Lamins / Mezzio应用程序中执行搜索,似乎需要更长的时间。

在我的本地机器上工作得很快。在一次搜索中,活动机器的CPU / RAM使用率从未超过70%,所以我不认为它依赖于硬件。

有人能帮我吗,告诉我我能做些什么来提高我的表现?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-15 08:07:49

解决方案是添加Foreign,以便由数据库创建索引。即使表中已有数据,也可以添加Foreign。从那以后,性能得到了极大的提高。

为了解释为什么我以前没有使用Foreign :我想先使用代码,然后通过代码处理所有关系(删除约束等)。结果发现这不是个好主意。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74425067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档