如何避免数据库中的完整表扫描?

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`)
);

pathTableuserid 指定为引用某个表的(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?

【讨论】:

以上是关于如何避免数据库中的完整表扫描?的主要内容,如果未能解决你的问题,请参考以下文章

怎么从数据库中的一亿条数据中读取我想要的十条数据?

SQL 数据优化索引建suo避免全表扫描

SQL 数据优化索引建suo避免全表扫描

如何让mysql速度更快的响应?如何提高读取和查询速度

数据库优化 -索引-避免全表扫描

如何在不完整的 Django 表单字段中获取用户输入?