MySQL-索引

  1. 普通索引
  2. 索引的通用方法:
  3. 普通索引方法
  4. 唯一索引
  5. 主键索引
  6. 外键索引
  7. 全文索引
  8. 单列、多列索引
  9. 组合(复合)索引

普通索引

  普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。   

索引的通用方法:

# 查看索引
show index from table_name;
# 其中 Key_name 字段为索引名

# 删除索引 
drop index index_name on table_name;

普通索引方法

# 直接创建索引(length表示使用名称前1ength个字符)  
CREATE INDEX index_name ON table_name(column_name(length))  

# 修改表结构的方式添加索引  
ALTER TABLE table_name ADD INDEX index_name ON (column_name)  

# 创建表的时候同时创建索引  
CREATE TABLE table_name (  
id int(11) NOT NULL AUTO_INCREMENT ,  
title char(255) NOT NULL ,  
PRIMARY KEY (id),  
INDEX index_name (title)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;   

# 建立复合索引 。  
CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);  

#注意命名时的习惯了吗?使用“表名字段1名字段2名”的方式 

唯一索引

  唯一索引就是唯一约束,与普通索引类似,除索引列的值必须唯一外跟普通索引无异。创建方法和普通索引类似。也就是说唯一约束的创建方式也可以由索引的创建方式创建。

  唯一索引简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率。

  唯一索引是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了。

主键索引

  必须为主键字段创建一个索引,这个索引就是所谓的”主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。

外键索引

  如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。   

全文索引

  MySQL从3.23.23版开始支持全文索引和全文检索,fulltext索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。////对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。
  这类场合正是全文索引(full-text index)可以大显身手的地方。在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用下面这条命令添加:
  ALTER TABLE table_name ADD FULLTEXT(column1, column2)
  有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法:
  SELECT * FROM table_name
  WHERE MATCH(column1, column2) AGAINST(‘word1’, ‘word2’, ‘word3’)
  上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。   

# 创建表的适合添加全文索引  
CREATE TABLE table_name (  
id int(11) NOT NULL AUTO_INCREMENT ,  
content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,  
PRIMARY KEY (id),  
FULLTEXT (content)  
);  

# 修改表结构添加全文索引  
ALTER TABLE table_name ADD FULLTEXT index_name(column_name)  
–直接创建索引  
CREATE FULLTEXT INDEX index_name ON table_name (column_name)  

  

单列、多列索引

  多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。

组合(复合)索引

  平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示
–使用到上面的索引
SELECT * FROM article WHREE title=’测试’ AND time=1234567890;
SELECT * FROM article WHREE title=’测试’;
–不使用上面的索引
SELECT * FROM article WHREE time=1234567890;   


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lzdong@foxmail.com

×

喜欢就点赞,疼爱就打赏