MySQL索引使用基础知识

MySQL索引,可以精通为图书的目录。所有的数码,相当于书本的富有情节。

借使要在书本中寻觅“怎么着学习编程”,显明,从目录出手查找,是急迅的不二法门(使用索引);不使用目录,直接一页书一页书地搜寻(全表扫描),功用会低很多。从数据库中询问数据的时候,使用索引,会增长查询效用。

MySQL常用的引擎是MyISAM和InnoDB。InnoDB是比较新的MySQL版本的默许引擎,扶助工作(ACID)。那两引擎,首要采纳B-Tree完毕索引。(回想可能不精确,后续再核实)InnoDB的目录,包涵具体的数额内容。

网络上有一些诸如“在询问频率高的列上建索引”的优化索引提出,开发者不可迷信。这个提出可能是人家在一定的准绳下使用的优化措施,对外人有用,但不自然有着普适性。很多世界,放之所在而皆准的真理,往往是不设有的。优化数据库,必须结合开发者面临的骨子里情状,在运用正确的尺度测试的底子上,胆战心惊地调动。

自家从《高品质MySQL》上读到几条关于索引的运作规则。

创建一个数目库表。
CREATE TABLE user
(
id INT NOT NULL AUTOCREMENT PRIMARY KEY,
firstName VARCHAR(100) NOT NULL DEFAULT ”,
lastName VARCHAR(100) NOT NULL DEFAULT ”,
age INT NOT NULL DEFAULT 0,
sex TINYINT NOT NULL DEFAULT 1,
KEY(firstName,lastName,age,sex)
)ENGINE=InnoDB;
(1-1)

(1)索引选择,遵从“最左匹配原则”。在确立的目录中,最左边的目录在查询中并未被用到,所有的目录将不会被应用。

SELECT * FROM user WHERE lastName=’cg’ AND age=12; (1-2)

(1-2)在查询中动用了lastName、age索引,没有拔取最左边的firstName索引,所以本次询问将不会选用索引。

(2)不会跳过中间的目录。

SELECT * FROM user WHERE firstName=’cg’ AND age=12; (1-3)

(1-3)询中使用了firstName、age,没有动用二者之间的lastName,这一次询问实际应用的目录将唯有firstName。

(3)查询条件中利用了相比较,不会动用索引。

SELECT * FROM user WHERE firstName=’cg’ AND age>=12 AND age<=15
AND lastName=’gz’; (1-4)

(1-4)查询由于包涵age>12,纵然age列上确立了目录,但在询问中如故不会被运用。假设改写比较表明式为IN,
SELECT * FROM user WHERE firstName=’cg’ AND age IN(12,13,14,15) AND
lastName=’gz’; (1-5)

询问中用到的目录将会是firstName、lastName、age。

(4)索引中不能够拔取表达式或函数。

SELECT * FROM user WHERE firstName=’cg’ AND lastName=’gz’ AND age
IN(11+1,13,14,15) AND sex=1;
(1-6)

(1-6)中出于包蕴11+1,查询的应用将不会动用age及其背后的目录。

(5)幸免建立冗余索引。若已经存在索引(A,B),假诺再建立目录(A),就是冗余索引;建立目录(B)或(B,A)不是冗余索引。

建立索引会带来资源开发。要精心设计索引,应用程序应该尽可能足够利用已经存在的目录。假若有的目录消耗了资源,却未曾夯实查询质量,就要清理掉那么些索引。
使用
EXPLAIN SELECT * FROM user WHERE firstName=’cg’ AND lastName=’gz’ AND
age IN(11+1,13,14,15) AND sex=1
(1-7)
能够查阅查询的施行进度。那条语句的归来音讯中,假使type的值是ALL,表示查询做了全表扫描,extra的值中涵盖using
index…,表示查询利用的目录。
GROUP BY、ORDER,也坚守上述索引使用规则。(需核实)

网站地图xml地图