当前位置:首页 > mysql > 正文内容

MySQL 索引基础 (一)

关中浪子2年前 (2022-03-07)mysql1082
【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价
找梯子最重要的就是稳定,这个已经上线三年了,一直稳定没有被封过,赶紧下载备用吧!

MySQL 索引基础 


①MySQL Index


一、SHOW INDEX会返回以下字段


1、Table 表的名称。


2、 Non_unique 如果索引不能包括重复词,则为0,如果可以则为1。


3、 Key_name 索引的名称


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


5、 Column_name 列名称。


6、 Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。


7、Cardinality 索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。


8、Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。


9、 Packed 指示关键字如何被压缩。如果没有被压缩,则为NULL。


10、 Null 如果列含有NULL,则含有YES。如果没有,则该列含有NO。


11、 Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。


12、 Comment 多种评注,您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的另一种形式。这两个语句是等价的:


mysql>SHOW INDEX FROM mytable FROM mydb;
mysql>SHOW INDEX FROM mydb.mytable;


二、使用 CREATE INDEX 创建索引


如果要为已存在的表创建索引,就需要使用 CREATE INDEX 命令或 ALTER TABLE 来创建索引。

CREATEINDEX idxtitle ON tablename (title)


这条命令将创建与 CREATE TABLE 命令相同的索引。


三、使用 ALTER TABLE 创建索引

ALTER TABLE tablename ADD INDEX idxtitle (title)


四、查看和删除索引


我们可以使用以下命令来查看已存在的索引:


SHOW INDEX FROM tablename
DROP INDEX indexname ON tablename


DROP INDEX 将删除 tablename 表上的 indexname 索引,indexname 就是我们创建表时指定的索引名。


########################################

createtable c(id char(20) not null primary key,`index` char(10));


问题1.如果我忘记把id设为主键现在该怎么办?输入什么命令?


ALTER TABLE record 
ADD PRIMARY KEY (id);


例如:ALTER TABLE `abc` ADD PRIMARY KEY(`a`); 


问题2.如果我想把id设为主键,同时想把name改为not null,且改为varchar(10),能不能用一句命令完成问题2?


ALTER TABLE record
ADD PRIMARY KEY (id),
CHANGEname varchar(10) not null;


########################################

索引 mysql index


        索引是一种数据结构,可以是B-tree, R-tree, 或者 hash 结构。其中R-tree 常用于查询比较接近的数据;B-trees适合用于查找某范围内的数据,可以很快的从当前数据找到下条数据;hash结构则适用于随机访问的场合,查找每条数据的时间几乎相同。显然,若要查找某个时间段的数据,用B-tree结构要比hash结构快好多。  


       优化查询的有效方法是为经常查询的字段建立索引,如无索引查询数据时,会遍历整张表(多么恐怖啊);若有了索引查找会容易很多。当进行 UPDATE, DELETE, 以及 INSERT 操作时,mysql会自动更新索引信息。



1.创建和删除索引( Creating and dropping indexes )



创建:


mysql> USE sakila;  
Database changed  
mysql> CREATE INDEX idx_actor_first_name ON actor (first_name);

或者  

mysql> ALTER TABLE actor ADD INDEX idx_actor_first_name (first_name);


PS:当用 create index 创建索引时,必须指定索引的名字,否则mysql会报错;

  用 ALTER TABLE 创建索引时,可以不指定索引名字,若不指定mysql会自动生成索引名字

  

建立索引时,若不想用存储引擎的默认索引类型,可以指定索引的类型:


mysql> ALTER TABLE temp_index  
 ADD INDEX (first_name),  
 ADD INDEX lname (last_name) USING BTREE

删除:



DROP INDEX indexname ON tblname  
mysql> DROP INDEX idx_actor_fname ON actor;  
mysql> ALTER TABLE actor DROP INDEX idx_actor_fname;


2.索引类型


BTREE    适合连续读取数据

RTREE    适合根据一条数据找附近的数据

HASH      适合随机读取数据

FULLTEXT    

SPATIAL


 查看某个表中存在的索引类型



mysql> SELECT INDEX_NAME,INDEX_TYPE  
-> FROM INFORMATION_SCHEMA.STATISTICS  
-> WHERE TABLE_NAME=’temp_index’;  
+------------+------------+  
| INDEX_NAME | INDEX_TYPE |  
+------------+------------+  
| first_name | HASH       |  
| lname      | BTREE      |  
+------------+------------+

3.索引冗余


如果两个或者多个索引包含了相同的索引信息,那么就存在索引冗余。


不同类型的索引有不同的索引冗余判断:

(1) SPATIAL 索引

SPATIAL 只能是一个简单索引,不能说复合索引;存在冗余的情况是同一个字段有两个索引。

(2) FULLTEXT 索引

若一个FULLTEXT索引是另一个索引的子集(不考虑字段顺序),则存在冗余。

例如: 表中包含如下两个索引 

■ (field1)

■ (field1, field2)

(3) HASH 索引

若一个索引在不考虑字段顺序的情况下,索引字段相同,则存在冗余。

例如:表中包含如下两个索引 

■ (field1, field2, field3)

■ (field1, field3, field2)

(4) BTREE 索引

若一个索引是另一个索引的子集(考虑字段顺序),则存在冗余。

例如:表中包含如下两个索引 

■ (field2)

■ (field2, field1)


PS:若两个或多个索引有相同的索引字段和字段顺序,但是有不同的索引类型,这样的索引是不冗余的。因为每种索引类型有自己的索引值。


扫描二维码推送至手机访问。

版权声明:本文由码农翻生发布,如需转载请注明出处。

本文链接:https://lubojian.cn/post/123.html

分享给朋友:

相关文章

MySQL 深入理解索引B+树存储 (二)

MySQL 深入理解索引B+树存储 (二)

数据结构及算法基础索引的本质MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能...

深入理解MySQL数据库的索引

索引的特点所有的MySQL列类型能被索引。在相关的列上的使用索引是改进SELECT操作性能的最好方法。一个表最多可有16个索引。最大索引长度是256个字节,尽管这可以在编译MySQL时被改变。对于CHAR和 VARCHAR列,你可以索引列的...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。