mysql查询数字比字符串快,与字符串相比,MySQL在where子句中使用数字更快吗?

假设您有4种评估类型:测试,测验,MiniQuiz和FinalExam

我们像这样将记录存储在数据库中

studentid ----- assesType

1 test

2 quiz

3 quiz

4 quiz

5 miniquiz

6 miniquiz

7 final

8 final

它是更快还是更好的为每种类型分配数字的方法,可以这样说:

测试= 1

测验= 2

小测验= 3

最终= 4

并使用它代替记录.

studentid ----- assesType

1 1

2 2

3 2

4 2

5 3

6 3

7 4

8 5

我真正想问的是,这样做值得吗?优势等?因为这样做时用服务器端选择的语言编写代码变得有点困难.

谢谢=)

解决方法:

是的,数字比较比字符串比较快.字符串还占用更多空间,并且数据重复意味着如果必须将“ miniquiz”重命名为“ microquiz”,则必须更新所有行.最后,也许是最重要的一点,您的数据库将无法拒绝不可接受的字符串:您说过有四种评估类型,但是数据库很乐意接受您传递的任何字符串.

通常,您将要创建另一个表,也许将其称为assesTypes,仅包含id和name字段,并将所有可接受的类型保留在其中.然后,在主表中,将assesType字段设置为foreign key,该字段引用新的assesTypes表的id属性.例:

CREATE TABLE assesTypes (

id int,

name varchar(15),

PRIMARY KEY (id)

) ENGINE=INNODB;

CREATE TABLE assessments (

student_id int,

assesType int,

mark int,

PRIMARY KEY (student_id, assesType),

FOREIGN KEY (assesType) REFERENCES assesTypes (id)

) ENGINE=INNODB;

现在我们可以填充我们的assesTypes表:

INSERT INTO assesTypes VALUES (1, 'Test');

INSERT INTO assesTypes VALUES (2, 'Quiz');

INSERT INTO assesTypes VALUES (3, 'MiniQuiz');

INSERT INTO assesTypes VALUES (4, 'FinalExam');

现在,让我们将一些评估数据插入评估表中:

INSERT INTO assessments VALUES (1, 1, 55);

INSERT INTO assessments VALUES (1, 2, 65);

INSERT INTO assessments VALUES (1, 3, 75);

很好现在,我们可以使用评估类型表INNER JOIN评估表,如下所示:

SELECT a.student_id, at.name, a.mark

FROM assessments a

JOIN assesTypes at ON (at.id = a.assesType);

对于此结果:

+------------+----------+------+

| student_id | name | mark |

+------------+----------+------+

| 1 | Test | 55 |

| 1 | Quiz | 65 |

| 1 | MiniQuiz | 75 |

+------------+----------+------+

3 rows in set (0.00 sec)

现在,让我们尝试在评估表中插入无效的asssesType:

INSERT INTO assessments VALUES (1, 5, 75);

我们不能. MySQL将报告:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails

外键不需要具有有效的关系数据库,但对于避免断开的关系和孤立的行(例如referential integrity),它们是必不可少的.要使ACID中的C能够正常运行,必须具有在数据库级别上强制执行引用完整性的功能.

标签:query-optimization,sql,mysql

来源: https://codeday.me/bug/20191105/1998172.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值