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';
posted @ 2019-01-02 11:48  xuejianbest  阅读(108)  评论(0编辑  收藏  举报