如何避免数据库中的完整表扫描?
Posted
技术标签:
【中文标题】如何避免数据库中的完整表扫描?【英文标题】:How to Avoid Complete Table Scan in Database? 【发布时间】:2012-10-07 06:45:58 【问题描述】:我想创建一个网站,用户可以在其中注册并上传 20 张图片到他们的帐户。 (计划未来允许用户上传无限图片)
我在数据库中有两个表。 一种用于保存用户数据 表名 - 成员 字段 - 用户 ID、用户名、密码、电子邮件。 其他用于保存图像路径 表名 - 图像 字段 - 用户 ID、图像路径
所以我可以在他的页面中显示用户的图像,从表“图像”搜索图像路径
一切正常。但如果用户数量增长,这将变得更慢。 例如 - 如果有 50000 个用户,我应该检查所有行以查找单个用户上传的图像 IE; 50000 个用户 ID * 20 个图像/用户 = 1000000 次扫描表行 这将使系统变慢并造成过载。 我应该怎么做才能避免这种情况?
【问题讨论】:
您将需要使用索引。如何设计它们取决于您的数据库结构。 hm... 我听说过数据库索引,但不知道如何使用它。你能不能给个很好的教程链接? 【参考方案1】:创建一个这样的架构,
CREATE TABLE dataTable
(
`userid` INT NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`email` VARCHAR(50) NOT NULL
CONSTRAINT tb_pk PRIMARY (`userID`),
CONSTRAINT tb1_uq UNIQUE (`username`)
);
CREATE TABLE pathTable
(
`userid` INT NOT NULL,
`imagepath` VARCHAR(50) NOT NULL,
CONSTRAINT tb_fk FOREIGN KEY (`userID`) REFERENCES dataTable(`userid`)
);
将pathTable
的userid
指定为引用某个表的(dataTable) 主键的外键,服务器会自动为其编制索引,这将加快搜索速度。
【讨论】:
【参考方案2】:在第二个表中的用户 ID 字段上创建索引。 句法: http://dev.mysql.com/doc/refman/5.0/en/create-index.html
What are the biggest benefits of using INDEXES in mysql?
【讨论】:
以上是关于如何避免数据库中的完整表扫描?的主要内容,如果未能解决你的问题,请参考以下文章