您的当前位置:首页正文

mysql索引简介

2023-11-09 来源:帮我找美食网

] );

其中 create_column_definition 可以替换成:

  • column_name column_definetion
  • [constraint [symbol]] primary key (column_name, ...) [index_type]
  • [constraint [symbol]] unique [index|key] (column_name, ...) [index_type]
  • {index|key} [index_name] (column_name, ...) [index_type]
  • {fulltext} [index | key] (column_name, ...) [index_type] 其中 column_definetion 可以替换成:
  • data_type [not null | null] [default default_value]
  • [auto_increment] [unique [key] | [primary] key]
  • [comment ‘string‘] [reference_definition]
  • 例如:

    create table test(`id` int unsigned not null auto_increment,`data0` varchar(20),`data1` varchar(20),primary key (`id`),);
    create table test(id int unsigned not null auto_increment primary key,`data0` varchar(20),`data1` varchar(20));

    表创建之后也可以添加索引: 1)使用alter命令:

    alter table table_name[alter_specification [, alter_specification] ... ];

    其中 alter_sepcification 可以替换成任意一种:

  • add [constraint [symbol]] primary key (index_cloumn_name, ... ) [index_type]
  • add [constraint [symbol]] unique [index|key] [index_name] (index_cloumn_name, ... ) [index_type]
  • add {index | key} [index_name] (index_cloumn_name, ... ) [index_type]
  • add [fulltext] [index|key] [index_name] (index_cloumn_name, ... ) [index_type]
  • 其中 index_cloumn_name 可以替换成:column_name [(length) [asc|desc]] 其中 index_type 可以替换成:using {btree|hash} 例如:

    alter table test add unique key `index_data0` (`data0` (10));

    2)使用create命令:

    create [unique|fulltext|spatial] index index_nameon table_name (index_cloumn_name, ... ) [index_type];

    其中 index_cloumn_name 可以替换成:column_name [(length) [asc|desc]] 其中 index_type 可以替换成:using {btree|hash} 需要注意的几点:

  • create命令不能用于创建primary key
  • 能够为char,varchar,binary,varbinary设置索引前缀长度,这意味着可以只索引这些字段的前面某部分。
  • blob和text若为索引项类型,必须指定索引前缀长度[5]。
  • 例如:

    create index `index_data1` on test (`data1` (10));

    删除索引:

    alter table table_name drop primary key;alter table table_name drop {index | key} index_name;

    当创建多列索引之后,查询全部索引或索引的前n列(与定义索引顺序一致),能够使用该索引[6]。例如:

    create table test(id int not null auto_increment,last_name char(30) not null,first_name char(30) not null,primary key (id),index name (last_name, first_name));

    以下这些查询能用到索引 name:

    select * from test where last=‘xyb‘;select * from test where last=‘xyb‘ and first_name=‘love‘;select * from test where last=‘xyb‘ and (first_name=‘love‘ or first_name=‘Charlotte‘);select * from test where last=‘xyb‘ and first_name >= ‘l‘ and first_name <= ‘n‘;

    以下这些chauncey不能用到索引 name:

    select * from test where first_name=‘Charlotte‘;select * from test where last=‘xyb‘ or first_name=‘Charlotte‘;

    综合讲解索引可以参见链接[7]

    参考链接: [1]http://www.tutorialspoint.com/mysql/mysql-indexes.htm [2]http://stackoverflow.com/questions/3844899/difference-between-key-primary-key-unique-key-and-index-in-mysql [3]https://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html [4]https://dev.mysql.com/doc/refman/5.0/en/alter-table.html [5]https://dev.mysql.com/doc/refman/5.0/en/create-table.html [6]https://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html [7]http://blog.csdn.net/tianmohust/article/details/7930482

    mysql索引简介

    标签:mysql   索引   index   

    小编还为您整理了以下内容,可能对您也有帮助:

    数据库中有哪些索引,各有什么特点

    数据库中的索引有普通索引、唯一性索引、全文索引等,特点如下:

    普通索引是由KEY或INDEX定义的索引,它是MySQL中的基本索引类型,可以创建在任何数据类型中,其值是否唯一和非空由字段本身的约束条件所决定。例如,在grade表的stuid字段上建立一个普通索引,查询记录时,就可以根据该索引进行查询了。

    唯一性索引是由UNIQUE定义的索引,该索引所在字段的值必须是唯一的。例如,在grade表的id字段上建立唯一性索引,那么,id字段的值就必须是唯一的。

    全文索引是由FULLTEXT定义的索引,它只能创建在CHAR、VARCHAR或TEXT类型的字段上,而且,现在只有MyISAM存储引擎支持全文索引。

    索引的概念

    在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

    索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

    mysql索引有哪些类型

    MySQL目前主要有的索引类型为:普通索引、唯一索引、主键索引、组合索引、全文索引。下面本篇文章就来给大家介绍一下这些MySQL索引,希望对你们有所帮助。

    通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力。索引优化时mysql中的一种优化方式。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

    下面我们来看看MySQL目前主要有的索引类型:

    1、普通索引

    普通索引是最基本的索引,它没有任何,值可以为空;仅加速查询。可以通过以下几种方式来创建或删除:

    1)、直接创建索引

    CREATE INDEX index_name ON table(column(length))2)、修改表结构的方式添加索引

    ALTER TABLE table_name ADD INDEX index_name ON (column(length))3)、删除索引

    DROP INDEX index_name ON table2、唯一索引

    唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。简单来说:唯一索引是加速查询 + 列值唯一(可以有null)。以通过以下几种方式来创建:

    1)、创建唯一索引

    CREATE UNIQUE INDEX indexName ON table(column(length))2)、修改表结构

    ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))3、主键索引

    主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。简单来说:主键索引是加速查询 + 列值唯一(不可以有null)+ 表中只有一个。

    一般是在建表的时候同时创建主键索引:

    CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

    4、组合索引

    组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。

    可以说:组合索引是多列值组成的一个索引,专门用于组合搜索,其效率大于索引合并。

    ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);5、全文索引

    全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。

    1)、创建表的适合添加全文索引

    CREATE TABLE `table` (

    `id` int(11) NOT NULL AUTO_INCREMENT ,

    `title` char(255) CHARACTER NOT NULL ,

    `content` text CHARACTER NULL ,

    `time` int(10) NULL DEFAULT NULL ,

    PRIMARY KEY (`id`),

    FULLTEXT (content)

    );2)、修改表结构添加全文索引

    ALTER TABLE article ADD FULLTEXT index_content(content)3)、直接创建索引

    CREATE FULLTEXT INDEX index_content ON article(content)简单来说:全文索引是对文本的内容进行分词,进行搜索。

    MySQL如何使用索引 较为详细的分析和例子_MySQL

    在数据库表中,使用索引可以大大提高查询速度。假如我们创建了一个 testIndex表:

    CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOTNULL);

    我们随机向里面插入了 1000条记录,其中有一条 i_testID vc_Name 555 erquan

    在查找 vc_Name="erquan"的记录 SELECT *FROM testIndex WHERE vc_Name='erquan'; 时,如果在vc_Name 上已经建立了索引,MySql 无须任何扫描,即准确可找到该记录!相反,MySql 会扫描所有记录,即要查询 1000。以索引将查询速度提高 100 倍。

    一、索引分单列索引和组合索引

    单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引:即一个索包含多个列。

    二、介绍一下索引的类型

    1、普通索引。

    这是最基本的索引,它没有任何。它有以下几种创建方式:

    (1)创建索引:CREATE INDEX indexName ONtableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是 BLOB 和 TEXT 类型,必须指定 length,下同。

    (2)修改表结构:ALTER tableName ADD INDEX[indexName] ON (tableColumns(length))

    (3)创建表的时候直接指定:CREATE TABLE tableName ( [...],INDEX [indexName] (tableColumns(length)) ;

    2、唯一索引。

    它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    (1)创建索引:CREATE UNIQUE INDEX indexName ONtableName(tableColumns(length))

    (2)修改表结构:ALTER tableName ADD UNIQUE[indexName] ON (tableColumns(length))

    (3)创建表的时候直接指定:CREATE TABLE tableName ( [...],UNIQUE [indexName] (tableColumns(length));

    3、主键索引

    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_NameVARCHAR(16) NOT NULL,PRIMARY KEY(i_testID));当然也可以用ALTER 命令。记住:一个表只能有一个主键。

    4、全文索引

    MySQL从 3.23.23 版开始支持全文索引和全文检索。

    删除索引的语法:DROP INDEX index_name ON tableName

    三、单列索引和组合索引

    为了形象地对比两者,再建一个表:

    CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_NameVARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL,i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );

    在这 10000条记录里面 7 上 8 下地分布了 5 条 vc_Name="erquan" 的记录,只不过 city,age,school 的组合各不相同。

    来看这条 T-SQL:SELECT i_testID FROM myIndex WHEREvc_Name='erquan' AND vc_City='郑州' AND i_Age=25;

    首先考虑建单列索引:

    在 vc_Name列上建立了索引。执行 T-SQL 时,MYSQL 很快将目标锁定在了 vc_Name=erquan 的 5 条记录上,取出来放到一中间结果集。在这个结果集里,先排除掉 vc_City 不等于"郑州"的记录,再排除 i_Age 不等于 25 的记录,最后筛选出唯一的符合条件的记录。

    虽然在 vc_Name上建立了索引,查询时MYSQL不用扫描整张表,效率有所提高,但离我们的要求还有一定的距离。同样的,在 vc_City 和 i_Age 分别建立的单列索引的效率相似。

    为了进一步榨取 MySQL的效率,就要考虑建立组合索引。就是将 vc_Name,vc_City,i_Age 建到一个索引里:

    ALTER TABLE myIndex ADD INDEX name_city_age(vc_Name(10),vc_City,i_Age);

    建表时,vc_Name长度为 50,这里为什么用 10 呢?因为一般情况下名字的长度不会超过 10,这样会加速索引查询速度,还会减少索引文件的大小,提高 INSERT 的更新速度。

    执行 T-SQL时,MySQL 无须扫描任何记录就到找到唯一的记录!!

    肯定有人要问了,如果分别在 vc_Name,vc_City,i_Age 上建立单列索引,让该表有 3 个单列索引,查询时和上述的组合索引效率一样吗?大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但 MySQL 只能用到其中的那个它认为似乎是最有效率的单列索引。

    建立这样的组合索引,其实是相当于分别建立了

    vc_Name,vc_City,i_Age

    vc_Name,vc_City

    vc_Name

    这样的三个组合索引!为什么没有 vc_City,i_Age 等这样的组合索引呢?这是因为 mysql 组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个 T-SQL 会用到:

    SELECT * FROM myIndex WHREE vc_Name="erquan" ANDvc_City="郑州"

    SELECT * FROM myIndex WHREEvc_Name="erquan"

    而下面几个则不会用到:

    SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"

    SELECT * FROM myIndex WHREE vc_City="郑州"

    四、使用索引

    到此你应该会建立、使用索引了吧?但什么情况下需要建立索引呢?一般来说,在 WHERE和 JOIN 中出现的列需要建立索引,但也不完全如此,因为 MySQL 只对 =,BETWEEN,IN,以及某些时候的LIKE(后面有说明)才会使用索引。

    SELECT t.vc_Name FROM testIndex t LEFT JOIN myIndex m ONt.vc_Name=m.vc_Name WHERE m.i_Age=20 AND m.vc_City='郑州'时,有对 myIndex 表的 vc_City 和 i_Age 建立索引的需要,由于testIndex 表的 vc_Name 开出现在了 JOIN 子句中,也有对它建立索引的必要。

    刚才提到了,只有某些时候的 LIKE才需建立索引?是的。因为在以通配符 % 和 _ 开头作查询时,MySQL 不会使用索引,如 SELECT * FROM myIndex WHERE vc_Name like'erquan%'

    会使用索引,而 SELECT * FROM myIndex WHEREt vc_Namelike'%erquan' 就不会使用索引了。

    五、索引的不足之处

    上面说了那么多索引的好话,它真的有像传说中那么优秀么?当然会有缺点了。

    1、虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE 和DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件。

    2、建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

    讲了这么多,无非是想利用索引提高数据库的执行效率。不过索引只是提高效率的一个因素。如果你的MySQL有大数据的表,就需要花时间研究建立最优秀的索引或优化查询语句。

    Mysql如何适当的添加索引介绍

    这里先简单介绍一下索引:

    添加索引是为了提高数据库查询性能,索引是最物美价廉的东西了,不用加内存,不用改程序,不用调sql,只要执行个正确的create index ,查询的速度就可能提高百倍千倍,这可是有力的,可是天下没有没费的午餐,查询的速度的提高是以牺牲insert update delete的速度为代价的。而且索引大小一般是数据的三分之一 ,再加上索引要加载进内存的,如果全部字段都加索引会以牺牲内存为代价的,所以才要设当的添加索引。

    这里简单介绍一下mysql中常用索引:

    在添加索引之前最好先查看一下该表中已存在哪些索引:show index from 表名;

    1、主键索引

    注意: 主键索引一张表中只能有一个,但是可以添加多个索引 比如:唯一索引、普通索引、全文索引。

    主键索引:一般在建表的时候就添加了 比如:id 一般是主键索引加自动递增。

    建表后添加主键索引 :alter table table_name add primary key (column name);

    主键索引的特点:不能为空且唯一。

    2、普通索引

    创建普通索引:alter table table_name add index 索引名(column1,column2);

    3、唯一索引

    创建唯一索引:ALTER TABLE `table_name` ADD UNIQUE (`column`);

    唯一索引与主键索引的区别:

    唯一索引:可以有多个null 但数据内容不能重复

    主键索引:不能为null,且内容只能唯一。

    两个区别就在于主键索引不能为null 唯一索引可以有多个null 其余都一样。

    4、全文索引

    全文索引只有MyISAM有效(mysql5.6之后InnoDB也支持了全文索引)[5.7不支持MyISAM]

    全文索引主要针对文本文件,比如文章、标题。

    在创建表时创建全文索引:

    CREATE TABLE `article` (

    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

    `title` varchar(200) DEFAULT NULL,

    ` content` text,

    PRIMARY KEY (`id`),

    FULLTEXT KEY `title` (`title`,`content`)

    ) ENGINE=MyISAM(5.6之后InnoDB也支持全文索引 、5.7不支持MyISAM引擎) DEFAULT CHARSET=utf8;

    在现有表中创建全文索引:

    ALTER TABLE article ADD FULLTEXT INDEX fulltext_article(title,content);

    创建完全文索引之后使用也有要注意的地方:

    众所周知在数据库中进行模糊查询是使用like关键字进行查询的,例如:

    SELECT * FROM article WHERE content LIKE ‘%查询字符串%';

    那么,我们在使用全文索引也这样使用吗?当然不是,我们必须使用特有的语法才能使用全文索引进行查询,例如,我们想要在article表的title和content列中全文检索指定的查询字符串,我们可以如下编写SQL语句:

    SELECT * FROM article WHERE MATCH(title,content) AGAINST (‘查询字符串');

    强烈注意:MySql自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。

    注:目前,使用MySql自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySql全文索引所能找到的词默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。

    如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。

    删除索引sql语句:alter table table_name drop index 索引名;

    通过上面的简单介绍后,那么应该在哪些字段上添加索引呢?

    1、 频繁查询的字段,应该创建索引。

    2、更新非常频繁的字段,不应该创建索引。

    3、唯一性太差的字段,比如 gender字段,就不应该创建索引。

    4、不会出现在where条件之后的字段,不应该创建索引。

    满足一下条件,应该创建索引:

    1、频繁要查询的字段,经常出现在where条件后面的字段,应该创建索引。

    2、更新不频繁的字段,可以创建索引。

    索引使用的注意事项

    1.对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。

    比如我们对title,content 添加了复合索引

    select * from table_name where title = 'test';会用到索引

    select * from table_name where content = 'test';不会用到索引

    2.对于使用like的查询,查询如果是‘%a'不会使用到索引,而 like 'a%'就会用到索引。最前面不能使用%和_这样的变化值

    3.如果条件中有or,即使其中有条件带索引也不会使用。

    4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。

    查看索引的使用情况:show status like‘Handler_read%';

    handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

    handler_read_rnd_next:这个值越高,说明查询低效。

    总结

    Top