mysql索引

一.含义:

  索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快 要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。

二.索引分类:

  1. 普通索引
  2. 唯一索引
  3. 主键索引
  4. 外键索引
  5. 全文索引(FULLTEXT)
  6. 单列索引、多列索引
  7. 组合(复合)索引(最左前缀)

默认情况下,如果未指定索引类型,MySQL将创建B-Tree索引。 以下显示了基于表的存储引擎的允许索引类型:

何时使用聚集索引或非聚集索引

三.索引建立的情景以及优缺点

数据库在什么情况下适合添加索引

  1. 表的某个字段值得离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时,cardinality(基数,集的势)的值就等于该表的行数。MySQL在处理主键约束以及唯一性约束时,考虑周全。数据库用户创建主键约束的同时,MySQL自动创建主索引(primaryindex),且索引名称为Primary;数据库用户创建唯一性索引时,MySQL自动创建唯一性索引(uniqueindex),默认情况下,索引名为唯一性索引的字段名。
  2. 占用存储空间少的字段更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字。
  3. .存储空间固定的字段更适合选作索引的关键字。与text类型的字段相比,char类型的字段较为适合选作索引关键字。
  4. Where子句中经常使用的字段应该创建索引,分组字段应该创建索引,两个表的连接字段应该创建索引。
  5. 更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。
  6. 最左前缀原则。
  7. 尽量使用前缀索引。
  8. 在经常需要搜索的列上,可以加快搜索的速度
  9. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
  10. 在经常用在连接(JOIN)的列上,这些列主要是一外键,可以加快连接的速度
  11. 在经常需要根据范围(<,<=,=,>,>=,BETWEEN,IN)进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
  12. 在经常需要排序(order by)的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

以下情况不宜建立索引:

  1. 索引不会包含有NULL值的列,只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
  2. 使用短索引,对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
  3. 索引列排序,MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么orderby中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
  4. like语句操作,一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like“%aaa%”不会使用索引而like“aaa%”可以使用索引。
  5. 不要在列上进行运算,例如:select from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select from users where adddate<’2007-01-01′。关于这一点可以围观:一个单引号引发的MYSQL性能损失。​
  6. 不使用NOTIN、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
  7. 索引要建立在经常进行select操作的字段上,这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
  8. 索引要建立在值比较唯一的字段上
  9. 对于那些定义为text、image和bit数据类型的列不应该增加索引,因为这些列的数据量要么相当大,要么取值很少。
  10. where的查询条件里有不等号(wherecolumn!=…),mysql将无法使用索引
  11. 如果where字句的查询条件里使用了函数(如:whereDAY(column)=…),mysql将无法使用索引
  12. 在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用
  13. ​MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。

优点:

  1. 索引大大减小了服务器需要扫描的数据量,从而大大加快数据的检索速度,这也是创建索引的最主要的原因。
  2. 索引可以帮助服务器避免排序和创建临时表
  3. 索引可以将随机IO变成顺序IO
  4. 索引对于InnoDB(对索引支持行级锁)非常重要,因为它可以让查询锁更少的元组,提高了表访问并发性
  5. 关于InnoDB、索引和锁:InnoDB在二级索引上使用共享锁(读锁),但访问主键索引需要排他锁(写锁)
  6. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  7. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
  8. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  9. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

  1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
  2. 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,如果需要建立聚簇索引,那么需要占用的空间会更大
  3. 对表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度
  4. 如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
  5. 对于非常小的表,大部分情况下简单的全表扫描更高效;

四.索引的创建,查看,删除 

创建索引
CREATE TABLE table_name[col_name data type]
[unique|fulltext][index|key][index_name](col_name[length])[asc|desc]

查看索引
SHOW INDEX FROM table_name;

删除索引
DROP INDEX index_name ON table_name;
  1. unique|fulltext为可选参数,分别表示唯一索引、全文索引
  2. index和key为同义词,两者作用相同,用来指定创建索引
  3. col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择
  4. index_name指定索引的名称,为可选参数,如果不指定,默认col_name为索引值
  5. length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度
  6. asc或desc指定升序或降序的索引值存储
  7. length代表我们使用前面字段中的长度限制,length要小于等于定义索引列的长度。如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
查看索引
SHOW INDEX FROM table_name;

其中,各个字段的含义:

  table: 表的名称

  Non_unique: 索引是否可以重复。不可以重复则为0;可以重复则为1。

  Key_name: 索引名称。创建的时候,可以选择输入,不输入 MySQL 自动生成。如果索引是主键,则名称始终为 PRIMARY。

  Seq_in_index: 索引中的列序列号,从1开始。

  Column_name: 索引涉及到的列的名称。

  Collation:列如何在索引中排序。这可以具有值 A(ascending 升序),D ( descending 降序)或NULL(未排序)。

  Cardinality: 索引中唯一值的数量(不是实时更新的准确数据)。

  Sub_part: 索引前缀长度。如果使用字段的部分字符作为索引,那么显示索引字符数量。如果使用整个字段都被索引,那么为 NULL。

  Packed: key的打包方式,NULL 表示不打包。

  Null: 索引列包含 NULL 或者 ‘’ 的时候,会是 YES。

  Index_type: 索引类型。(BTREE, FULLTEXT,HASH, RTREE)之一。

  Comment: 未在当前列中描述的索引信息,例如 disabled 索引是否已禁用。

  Index_comment: 在创建索引时提供的注释。

  Visible: 索引是否对优化程序可见(有的版本会出现该信息)。

五.索引分类详细介绍

5.1普通索引

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

  一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入;

–直接创建索引(length表示使用名称前1ength个字符)  
CREATE INDEX index_name ON table_name(column_name(length))  
CREATE INDEX index_first_name ON employees(first_name(20))//length要小于等于定义索引列的长度
–修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX [indexName] (column_name(length))
ALTER TABLE employees ADD INDEX index_last_name  (last_name(10))
–创建表的时候同时创建索引  
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=utf8;  
–删除索引  
DROP INDEX index_name ON table_name;  
ALTER TABLE table_name DROP INDEX index_name;

建立复合索引。  
CREATE INDEX index_name ON table_name(column_name1(length),column_name2(length),...) 

5.2唯一索引(不支持int类型的列定义唯一索引)

   与普通索引类似,不同的就是:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,索引列的值必须唯一,但允许有空值。(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。 ​ 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。 

–直接创建索引(length表示使用名称前1ength个字符)  
CREATE UNIQUE INDEX index_name ON table_name(column_name(length))  
CREATE UNIQUE INDEX index_name ON table_name(title(225))//不支持int类型的列定义唯一索引 
–修改表结构的方式添加索引
ALTER TABLE table_name ADD UNIQUE [indexName] (column_name(length))
ALTER TABLE table_name ADD UNIQUE  index_name  (title(10))
–创建表的时候同时创建索引  
CREATE TABLE `table_name` (  
    `id` int(11) NOT NULL AUTO_INCREMENT ,  
    `title` char(255) NOT NULL ,  
    PRIMARY KEY (`id`),  
    UNIQUE index_name (title)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;  
 

5.3主键索引

必须为主键字段创建一个索引,唯一且非空,这个索引就是所谓的”主索引”。一张表只能有一个主键索引,不允许重复、不允许为 NULL;主键索引与唯一索引创建的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。

–创建表的时候直接指定  
CREATE TABLE `table_name` (  
`id` int(11) NOT NULL AUTO_INCREMENT ,  
`title` char(255) NOT NULL ,  
PRIMARY KEY (`id`),  
UNIQUE index_name (title)  
);  
-单列主键不容许修改和删除索引
–修改表结构创建主键索引  
-ALTER TABLE table_name ADD PRIMARY KEY (title); 
-注意:不能用CREATE INDEX语句创建PRIMARY KEY索引。
–删除索引  
-ALTER TABLE table_name DROP PRIMARY KEY;
-注意:因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。不允许对主键索引显式地使用 DROP INDEX

5.4外键索引

  外键(外键索引foreign key):是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。即:父表更新时,子表也更新;父表删除时,如果子表有匹配的项,则删除失败,父表删除时子表匹配的项必须也删除。使用外键可以使得修改或者删除的级联操作的日常维护工作更加轻松。如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。

5.4.1.基本概念

1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。

2、外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。

3、如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表并且希望在此基础上保持良好的性能,最好选择表结构为innoDB类型。

4、外键的使用条件

  ① 两个表必须是InnoDB表,MyISAM表暂时不支持外键

  ② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;

  ③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

5、外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作。保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!可以使得两张表关联,保证数据的一致性和实现一些级联操作;

6、外键也称之为外键约束: 主要作用在于对数据进行约束.

  • 约束1: 外键对子表的数据写操作约束: (增加和更新): 如果子表中插入的数据所对应的外键在父表不存在: 不能成功.
  • 约束2: 外键对父表也有数据约束: 当父表操作一个记录,但是该记录被子表所引用的时候,那么父表的操作将会被限制(更新: 主键和删除)

7、约束控制有三种模式

  • 严格模式: district(默认的)
  • 置空模式: set null,对子表的限制: 当父表删除一个被子表引用的记录的时候,会自动的将子表中对应的父表引用(外键)设置成NULL
  • 级联模式: cascade, 级联操作: 当父表对一个被子表引用的数据进行操作的时候,会自动的连带更新子表对应的数据.(更新操作)

5.4.2.使用方法

创建修改外键的语法:

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
//alert方式
alter
table 表名 add constraint 外键名 foreign key(外键字段) references 父表(主键字段) alter table busi_table add constraint repo_id foreign key(repo_id) references repo_table (repo_id)

外键删除语法,外键不能被修改,只能先删除后新增.

alter table 表名 drop foreign key 外键名;

该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。

ON DELETE、ON UPDATE表示事件触发限制,可设参数:

  ① RESTRICT(限制外表中的外键改动,默认值)

  ② CASCADE(跟随外键改动)

  ③ SET NULL(设空值)

  ④ SET DEFAULT(设默认值)

  ⑤ NO ACTION(无动作,默认的)

5.4.3.示例:

1)创建2个表

表1
CREATE
TABLE repo_table ( repo_id CHAR (13) NOT NULL PRIMARY KEY, repo_name CHAR (14) NOT NULL ) type = INNODB;

表2
CREATE
TABLE busi_table ( busi_id CHAR (13) NOT NULL PRIMARY KEY, busi_name CHAR (13) NOT NULL, repo_id CHAR (13) NOT NULL, FOREIGN KEY (repo_id) REFERENCES repo_table (repo_id) ) type = INNODB;

2)插入数据

insert into repo_table values("12","sz"); -- //success
insert into repo_table values("13","cd"); -- //success
insert into busi_table values("1003","cd", "13"); -- //success
insert into busi_table values("1002","sz", "12"); -- //success
insert into busi_table values("1001","gx", "11"); -- //failed,提示:
> 1452 - Cannot add or update a child row: a foreign key constraint fails (`myemployees`.`busi_table`, CONSTRAINT `busi_table_ibfk_1` FOREIGN KEY (`repo_id`) REFERENCES `repo_table` (`repo_id`))

3)增加级联操作(mysql命令)

mysql> alter table busi_table
-> add constraint id_check
-> foreign key(repo_id)
-> references repo_table(repo_id)
-> on delete cascade
-> on update cascade;

5.4.4.相关操作

外键约束(表2)对父表(表1)的含义:

在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句。

5.4.5.其他

在外键上建立索引:

index repo_id (repo_id),
foreign key(repo_id) references repo_table(repo_id))

外键约束使用最多的两种情况无外乎:

  1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

  2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

  前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

InnoDB允许你使用ALTER TABLE在一个已经存在的表上增加一个新的外键:

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) 
REFERENCES tb2_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] 

InnoDB也支持使用ALTER TABLE来删除外键:

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol; 

5.5全文索引(FULLTEXT)

  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)

5.6单列索引、多列索引

  •  多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
  • 单例索引:一个索引只包含一个列,一个表可以有多个单例索引。
  • 组合索引:一个组合索引包含两个或两个以上的列。查询的时候遵循 mysql 组合索引的 “最左前缀”原则,即使用 where 时条件要按照建立索引的时候字段的排列方式放置索引才会生效。

5.7组合(复合)索引(最左前缀)

平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。在这里要指出,组合索引和前缀索引是对建立索引技巧的一种称呼,并不是索引的类型。为了更好的表述清楚,建立一个demo表如下。

create table USER_DEMO
(
   ID                   int not null auto_increment comment '主键',
   LOGIN_NAME           varchar(100) not null comment '登录名',
   PASSWORD             varchar(100) not null comment '密码',
   CITY                 varchar(30) not null comment '城市',
   AGE                  int not null comment '年龄',
   SEX                  int not null comment '性别(0:女 1:男)',
   primary key (ID)
);

建立组合索引,即将LOGIN_NAME,CITY,AGE建到一个索引里:

ALTER TABLE USER_DEMO ADD INDEX name_city_age (LOGIN_NAME(16),CITY,AGE);

建表时,LOGIN_NAME长度为100,这里用16,是因为一般情况下名字的长度不会超过16,这样会加快索引查询速度,还会减少索引文件的大小,提高INSERT,UPDATE的更新速度。

​ 如果分别给LOGIN_NAME,CITY,AGE建立单列索引,让该表有3个单列索引,查询时和组合索引的效率是大不一样的,甚至远远低于我们的组合索引。虽然此时有三个索引,但mysql只能用到其中的那个它认为似乎是最有效率的单列索引,另外两个是用不到的,也就是说还是一个全表扫描的过程。

​ 建立这样的组合索引,就相当于分别建立如下三种组合索引:

LOGIN_NAME,CITY,AGE
LOGIN_NAME,CITY
LOGIN_NAME

为什么没有CITY,AGE等这样的组合索引呢?这是因为mysql组合索引“最左前缀”的结果。简单的理解就是只从最左边的开始组合,并不是只要包含这三列的查询都会用到该组合索引。也就是说name_city_age(LOGIN_NAME(16),CITY,AGE)从左到右进行索引,如果没有左前索引,mysql不会执行索引查询。

​如果索引列长度过长,这种列索引时将会产生很大的索引文件,不便于操作,可以使用前缀索引方式进行索引,前缀索引应该控制在一个合适的点,控制在0.31黄金值即可(大于这个值就可以创建)。

SELECT COUNT(DISTINCT(LEFT(`title`,10)))/COUNT(*) FROM Arctic; -- 这个值大于0.31就可以创建前缀索引,Distinct去重复
ALTER TABLE `user` ADD INDEX `uname`(title(10)); -- 增加前缀索引SQL,将人名的索引建立在10,这样可以减少索引文件大小,加快索引查询速度

 

posted @ 2021-05-10 00:16  程序员小明1024  阅读(162)  评论(0编辑  收藏  举报