Php 优化MySQL搜索过程

Php 优化MySQL搜索过程,php,mysql,search,methods,Php,Mysql,Search,Methods,以下是情景1。 我有一个名为“items”的表,表内有2列,e。g项目id和项目名称。 我以这种方式存储数据: 项目标识|项目名称 Ss001 | Shirt1 Sb002 | Shirt2 Tb001 | TShirt1 Tm002 | TShirt2 。。。等等,我以这种方式存储: 第一个字母是衣服的代号,即S代表衬衫,T代表T恤 第二个字母是大小,即s表示小,m表示中,b表示大 假设在我的项目表中,我有10000个项目。我想快速检索,假设我想找到一件特定的衬衫,我可以使用

以下是情景1。

我有一个名为“items”的表,表内有2列,e。g<代码>项目id和
项目名称
。 我以这种方式存储数据: 项目标识|项目名称

Ss001   | Shirt1
Sb002   | Shirt2
Tb001   | TShirt1
Tm002   | TShirt2
。。。等等,我以这种方式存储: 第一个字母是衣服的代号,即S代表衬衫,T代表T恤 第二个字母是大小,即s表示小,m表示中,b表示大 假设在我的项目表中,我有10000个项目。我想快速检索,假设我想找到一件特定的衬衫,我可以使用:

方法1:

SELECT * from items WHERE item_id LIKE Sb99; 
或者我应该这样做:

方法2:

SELECT * from items WHERE item_id LIKE S*; 
*存储结果,然后对大小执行第二次搜索,然后对id执行第三次搜索。就像哈希表的概念一样。 我想实现的是,我不想搜索所有数据,而是希望通过搜索衣服代码,然后是尺码代码,然后是身份证代码来最小化搜索。在mysql中,哪一个在速度方面更好。从长远来看,哪一个更好。我想减少流量,不要经常干扰数据库

谢谢你们解决了我的第一个问题。但另一种情况是:

场景2:

我正在使用PHP和MySQL。从前面的故事继续。如果我的用户表结构如下所示:

user_id | username | items_collected

U0001   | Alex     | Ss001;Tm002
U0002   | Daniel   | Tb001;Sb002
U0003   | Michael  | ...
U0004   | Thomas   | ...
我将收集的项目存储在id表单中,因为一天每个用户可以收集多达数百个项目,如果我存储为字符串,即Shirt1、pants2,…,则需要非常大的数据库空间(假设我们有1000个用户,并且一些项目名称非常长)

如果我以id形式存储,维护会更容易吗

如果让我们说,我想显示图像,图像的名称是项目的名称+jpg。怎么做?是这样的吗

user_id | username | items_collected

U0001   | Alex     | Ss001;Tm002
U0002   | Daniel   | Tb001;Sb002
U0003   | Michael  | ...
U0004   | Thomas   | ...
$result=选择从userid=$userid的用户收集的项目

使用php explode:

$itemsCollected=explode($result,“;”)

然后,匹配items表中的每个项目,以便:

衬衫1、裤子2等


Den使用循环函数,循环每个值并添加“.jpg”以显示图像?

第一个优化是将id拆分为三个不同的字段: 一个表示类型,一个表示大小,一个表示当前id结尾(无论结尾是什么意思)
如果你真的想保持当前的结构,就直接去搜索结果(选项1)。

第一个优化是将id分成三个不同的字段: 一个表示类型,一个表示大小,一个表示当前id结尾(无论结尾是什么意思)
如果确实要保留当前结构,请立即搜索结果(选项1)。

如果要加快搜索结果的速度,应将列拆分为多个列,每个属性对应一个列

第2步是为每一列创建一个索引。记住,mysql在每个查询中每个表只使用一个索引。因此,如果您确实希望快速查询,并且您的查询与这些属性有很大差异,那么您可能希望在(类型、大小、结束)、(类型、结束、大小)等上创建索引

例如,使用

select * from items where type = s and size = s and ending = 001
可以从索引(类型、大小、结尾)中获益,但:

不能,因为索引将只按顺序使用,所以它需要类型,然后是大小,然后是结束。这就是为什么如果你真的想要快速搜索,你可能需要多个索引


另一个注意事项是,通常在查询中使用*不是一个好主意,而是只选择所需的列。

如果要加快结果的速度,应将列拆分为多个列,每个属性一个列

第2步是为每一列创建一个索引。记住,mysql在每个查询中每个表只使用一个索引。因此,如果您确实希望快速查询,并且您的查询与这些属性有很大差异,那么您可能希望在(类型、大小、结束)、(类型、结束、大小)等上创建索引

例如,使用

select * from items where type = s and size = s and ending = 001
可以从索引(类型、大小、结尾)中获益,但:

不能,因为索引将只按顺序使用,所以它需要类型,然后是大小,然后是结束。这就是为什么如果你真的想要快速搜索,你可能需要多个索引


另一个注意事项是,通常在查询中使用*不是一个好主意,而是只选择您需要的列。

第一种方法会更快,但在我看来,这不是正确的方法。关于这一点,我和特文是一致的

我建议保持item_id不变,但添加两个额外字段,一个用于代码,一个用于大小,然后您可以执行以下操作:

select * from items where item_code = 'S' and item_size = 'm' 
使用索引,性能将大大提高,并且您将能够轻松匹配一系列大小或代码

select * from items where item_code = 'S' and item_size IN ('m','s')
按如下方式迁移数据库:

alter table items add column item_code varchar(1) default '';
alter table items add column item_size varchar(1) default '';

update items set item_code = SUBSTRING(item_id, 1, 1);
update items set item_size = SUBSTRING(item_id, 2, 1);
对代码的更改应该同样易于添加。长期利益是值得付出努力的


对于场景2,这不是从数据库存储和检索数据的有效方法。当以这种方式使用时,数据库仅充当存储引擎,通过将多个数据编码到字段中,您就排除了数据库的关系部分的用处

在这种情况下,您应该做的是创建另一个表,称之为“items\u collected”。该模式将遵循

CREATE TABLE items_collected (
   id int(11) NOT NULL auto_increment KEY,
   userid int(11) NOT NULL,
   item_code varchar(10) NOT NULL,  
   FOREIGN KEY (`userid`) REFERENCES `user`(`id`),
   FOREIGN KEY (`itemcode`) REFERENCES `items`(`item_code`)
 );
外键确保有,这很重要

那么,对于您给出的示例,您将有多个记录

 user_id | username | items_collected
 U0001   | Alex     | Ss001
 U0001   | Alex     | Tm002
 U0002   | Daniel   | Sb002
 U0002   | Daniel   | Tb001
 U0003   | Michael  | ...
 U0004   | Thomas   | ...

第一种方法会更快,但依我看,这不是正确的方法。关于这一点,我和特文是一致的

我建议保持item_id不变,但添加两个额外字段,一个用于代码,一个用于大小,然后您可以执行以下操作:

select * from items where item_code = 'S' and item_size = 'm' 
使用索引,性能将大大提高,并且您将能够轻松匹配一系列大小或代码

select * from items where item_code = 'S' and item_size IN ('m','s')
按如下方式迁移数据库:

alter table items add column item_code varchar(1) default '';
alter table items add column item_size varchar(1) default '';

update items set item_code = SUBSTRING(item_id, 1, 1);
update items set item_size = SUBSTRING(item_id, 2, 1);
对代码的更改应该同样易于添加。长期利益是值得付出努力的


对于场景2,这不是从数据库存储和检索数据的有效方法。以这种方式使用时,数据库仅充当