MySQL 索引基础 (一)
泛域名ssl证书 239元1年送1个月、单域名39元1年,Sectigo(原Comodo证书)全球可信证书,强大的兼容性,高度安全性,如有问题7天内可退、可开发票
加微信VX 18718058521 备注SSL证书
【腾讯云】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:若两个或多个索引有相同的索引字段和字段顺序,但是有不同的索引类型,这样的索引是不冗余的。因为每种索引类型有自己的索引值。