平时咱们查厚厚的书,都会先翻目录找对应的页码,这样能省不少时间。MySQL 数据库其实也有类似的 “目录”,这就是索引。不管是做网站还是处理数据,只要数据量稍微大一点,没索引的话查数据能慢到让人着急,所以学会创建索引特别重要。今天就跟大家聊聊 MySQL 里怎么弄这个 “目录”,也就是 mysql 如何创建索引的那些实用方法,还有需要注意的地方,就算是刚接触 MySQL 的朋友,看完也能跟着操作。
很多时候我们在新建数据表的时候,就可以顺便把索引建好,这样不用后续再折腾。比如咱们要建一个存储用户信息的表,里面有用户 ID、手机号、姓名这些字段。如果想让手机号这个字段查得快,在建表的时候就可以给它加索引。具体怎么写呢?用 CREATE TABLE 这个命令,比如 “CREATE TABLE user (id INT PRIMARY KEY, phone VARCHAR (20) NOT NULL, name VARCHAR (30), INDEX idx_phone (phone));”。这里面,id 后面跟了 PRIMARY KEY,这意思是把 id 设为主键,MySQL 会自动给主键建索引,不用咱们额外写 INDEX,主键就像每个人的身份证号,唯一且好找,所以主键索引是默认就有的。而 phone 字段后面,我们加了 INDEX idx_phone (phone),这里的 INDEX 就是告诉 MySQL 要给 phone 建索引,idx_phone 是索引的名字,起名字的时候尽量让自己能看懂,比如 idx_后面跟字段名,以后看索引就知道是哪个字段的。这是 mysql 如何创建索引的一种常见方法,适合新建表的时候一起弄,省得后面再单独操作。
但有时候表早就建好了,数据也存了不少,这时候想给某个字段加索引怎么办?别担心,MySQL 也有办法。常用的有两种方式,一种是用 ALTER TABLE 命令,另一种是用 CREATE INDEX 命令。比如咱们之前建的 user 表,现在想给邮箱字段(假设后来加了 email 字段)加索引,用 ALTER TABLE 的话就是 “ALTER TABLE user ADD INDEX idx_email (email);”,这里的 ADD INDEX 就是新增索引的意思,后面跟索引名和字段名。如果用 CREATE INDEX 的话,就是 “CREATE INDEX idx_email ON user (email);”,其实这两种方法的效果是一样的,就像买东西可以扫码付也可以现金付,看你习惯用哪种。比如我自己平时更常用 ALTER TABLE,因为有时候还会顺便改表的其他设置,一起操作更方便。这种方法也是 mysql 如何创建索引的常用方式,表已经存在的时候用很方便,而且不会影响表里面已经有的数据,放心用就行。
除了给单个字段建索引,有时候我们查数据会同时用多个字段,比如经常要按 “姓名 + 年龄” 来查用户,这时候给这两个字段建个联合索引会更快。联合索引的创建方法其实和单个字段差不多,比如还是 user 表,建姓名和年龄的联合索引,命令就是 “CREATE INDEX idx_name_age ON user (name, age);”。这里要特别注意一个点,联合索引的字段顺序特别重要,就像查字典要先按首字母找,再按第二个字母,顺序错了就没用了。比如建的是 name 在前、age 在后的联合索引,那查的时候用 name 或者 name+age 能用到索引,但如果只查 age,或者把 age 放前面、name 放后面,这个索引就用不上了。举个例子,你用 “WHERE name = "张三"” 或者 “WHERE name = "张三" AND age = 25” 能用到 idx_name_age,但用 “WHERE age = 25” 就用不上。所以建联合索引之前,一定要想清楚平时查数据常用的字段顺序,别建错了白费劲。联合索引的创建也是 mysql 如何创建索引中需要注意的点,因为顺序不对会影响效果,相当于白建了索引,还占着数据库的空间。
不过大家可别觉得索引越多越好,就像书的目录如果太多太细,反而找不到想看的内容,MySQL 的索引也是一样。首先,小表不用建索引,比如一个表只有几十条、几百条数据,查的时候全表扫一遍也就一瞬间,建索引反而会让插入、更新数据变慢,因为每次改数据还要同步改索引,没必要。其次,频繁更新的字段不适合建索引,比如有个字段每天要改几百次,建了索引之后,每次改这个字段,MySQL 都要更新对应的索引,不仅慢,还容易出问题,就像经常改页码的目录,改来改去自己都乱了。另外,索引字段别用函数,比如你想查姓名的第一个字是 “张” 的用户,写 “WHERE LEFT (name,1) = "张"”,如果 name 字段建了索引,这时候也用不上,因为用了 LEFT 函数之后,MySQL 就不认识这个索引了,只能全表扫。还有,索引的名字要规范,别随便起个 “idx1”“idx2”,以后看的时候根本不知道是哪个字段的,像之前那样用 “idx_字段名” 或者 “idx_字段 1_字段 2” 就很清楚,方便后面维护。
建完索引之后,怎么确认是不是建好了呢?很简单,用 SHOW INDEX FROM 命令就行,比如查看 user 表的索引,就是 “SHOW INDEX FROM user;”,执行这个命令之后,MySQL 会列出表上所有的索引,包括索引名、对应的字段、索引类型这些信息。比如你能看到主键索引(Key_name 会显示 PRIMARY),还有咱们建的 idx_phone、idx_email、idx_name_age 这些索引,每个索引对应的字段也会列出来。这样查一下,就能确认索引是不是建对了,有没有多建或者少建的情况。比如有时候不小心给同一个字段建了两个索引,用这个命令就能发现,然后删掉多余的,避免浪费空间。
总的来说,MySQL 的索引虽然看起来是个小功能,但用好了能让数据查询速度提升一大截,尤其是数据量几十万、几百万的时候,没索引和有索引的差距能差几十倍甚至上百倍。而学会 mysql 如何创建索引,就是用好索引的第一步,不管是建表时一起建,还是表建好后再补建,或者是建联合索引,只要跟着上面的方法来,注意字段顺序和那些避坑点,就能把索引用对。当然,除了创建,后面还要根据实际使用情况调整索引,比如有些索引长时间不用,占着空间还没用,就可以删掉,但这些都是后话了,先把创建这一步掌握好,就能解决大部分场景下的查询慢问题。