MySQL:索引
mysql中外键引用,引用列和被引用列都需要建立索引,否则建表语句会出错(errno 150)。
建立索引语句:
ALTER TABLE people ADD INDEX name_index (name);
对people表中name字段建立索引,索引名称name_index。
建立外键:
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts (model)
ON UPDATE CASCADE;
将pc表的cpumodel字段作为外键引用parts表的model字段,外键名称为fk_cpu_model。
其中ON UPDATE CASCADE表示在parts表的model字段改变时,引用这个值的外键(cpumodel字段值)值自动做相应改变。除了 CASCADE 外,还有 RESTRICT(禁止主表变更)、SET NULL(子表相应字段设置为空)等操作。
多列索引:
ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);
多列索引还有另外一个优点,它通过称为最左前缀(LeftmostPrefixing)的概念体现出来。继续考虑前面的例子,现在我们有一个firstname、lastname、age列上的多列索引,我们称这个索引为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用fname_lname_age索引:
firstname+lastname+age;
firstname+lastname;
firstname。
说明,它相当于我们创建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。
下面这些查询都能够使用这个fname_lname_age索引:
SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17';
SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan';
SELECT peopleid FROM people WHERE firstname='Mike';
The following queries cannot use the index at all:
SELECT peopleid FROM people WHERE lastname='Sullivan';
SELECT peopleid FROM people WHERE age='17';
SELECT peopleid FROM people WHERE lastname='Sullivan' AND age='17';