我在下面的问题中被问到一个我无法回答的问题。有人可以帮忙。
小学老师想要在MySQL数据库中存储她的名字,姓氏,出生日期,性别(0 =女性和1 =男性)以及每个学生的家庭电话号码。她想出了下表定义:
CREATE TABLE pupil(
pupil_id INT NOT NULL AUTO_INCREMENT,
first_name CHAR(50),
last_name CHAR(50),
date_of_birth CHAR(50),
gender INT,
phone_number CHAR(50),
PRIMARY_KEY (pupil_id)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
她经常运行以下查询
select * from pupil where pupil_id = 2;
select * from pupil where first_name = 'John';
select * from pupil where first_name = 'John' and last_name = 'Doe';
您对此表做出哪些更改?为什么?
答案 0 :(得分:1)
您应该在first_name
和last_name
列的表格中添加索引。
Syntax : CREATE INDEX `ind` ON `table`(`col`);
这将使索引列上的搜索更快。浏览这篇文章=> When to use indexes?和MySQL's docs。基本上,您使用经常搜索的项目上的索引来提高性能。但请记住一件事:太多的索引会减慢表中的插入速度。因此,有效使用索引肯定会加快查询速度。
答案 1 :(得分:0)
我的回答是我会添加两个索引。一个用于first_name,另一个用于first_name,last_name。
答案 2 :(得分:0)
如果您经常根据名字或名字和姓氏进行查询,那么将它们编入索引可能是个好主意:
CREATE INDEX pupil_names_ind ON pupil (first_name, last_name);
话虽如此,你应该首先运行一个基准测试。如果表只有几百行,那么它们中的大多数都是缓存,并且索引它将是一种浪费的努力。
答案 3 :(得分:0)
你只想要一个索引
CREATE INDEX pupils_by_name ON pupil (first_name, last_name)
首先通过主键
优化查询(按id)第二个查询(按名字)由pupils_by_name索引处理,因为它适合从左侧开始的索引列顺序,如果你想通过'last_name'字段优化查询,这个索引将不起作用,因为where子句中列的顺序必须与从左边开始的列的顺序匹配
thrid查询完全符合索引pupils_by_name
另外
date_of_birth CHAR(50)应为日期
性别INT应该是tinyint
答案 4 :(得分:0)
我会在first_name和last_name上创建索引(按此顺序)。这很重要。更多信息:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
然后我会将date_of_birth数据类型更改为日期