Php 优化MySQL搜索过程
以下是情景1。 我有一个名为“items”的表,表内有2列,e。g<代码>项目id和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个项目。我想快速检索,假设我想找到一件特定的衬衫,我可以使用
项目名称
。
我以这种方式存储数据:
项目标识|项目名称
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,这不是从数据库存储和检索数据的有效方法。以这种方式使用时,数据库仅充当