标签:
FROM:http://blog.csdn.net/tianmo2010/article/details/7930482
①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 )
创建:
PS:当用 create index 创建索引时,必须指定索引的名字,否则mysql会报错;
用 ALTER TABLE 创建索引时,可以不指定索引名字,若不指定mysql会自动生成索引名字
建立索引时,若不想用存储引擎的默认索引类型,可以指定索引的类型:
删除:
2.索引类型
BTREE 适合连续读取数据
RTREE 适合根据一条数据找附近的数据
HASH 适合随机读取数据
FULLTEXT
SPATIAL
查看某个表中存在的索引类型
3.索引冗余
如果两个或者多个索引包含了相同的索引信息,那么就存在索引冗余。
不同类型的索引有不同的索引冗余判断:
(1) SPATIAL 索引
SPATIAL 只能是一个简单索引,不能说复合索引;存在冗余的情况是同一个字段有两个索引。
(2) FULLTEXT 索引
若一个FULLTEXT索引是另一个索引的子集(不考虑字段顺序),则存在冗余。
例如: 表中包含如下两个索引
■ (field1)
■ (field1, field2)
(3) HASH 索引
若一个索引在不考虑字段顺序的情况下,索引字段相同,则存在冗余。
例如:表中包含如下两个索引
■ (field1, field2, field3)
■ (field1, field3, field2)
(4) BTREE 索引
若一个索引是另一个索引的子集(考虑字段顺序),则存在冗余。
例如:表中包含如下两个索引
■ (field2)
■ (field2, field1)
PS:若两个或多个索引有相同的索引字段和字段顺序,但是有不同的索引类型,这样的索引是不冗余的。因为每种索引类型有自己的索引值。
######################################
深入MySQL数据库的索引
摘要:本文介绍索引的类型,已经如何创建索引做了介绍,其中涉及三个比较重要的SQL语句――ALTER TABLE、CREATE/DROP INDEX和CREATE TABLE,注意它们的用法。
索引是加速表内容访问的主要手段,特别对涉及多个表的连接的查询更是如此。这是数据库优化中的一个重要内容,我们要了解为什么需要索引,索引如何工作以及怎样利用它们来优化查询。本节中,我们将介绍索引的特点,以及创建和删除索引的语法。
索引的特点
所有的MySQL列类型能被索引。在相关的列上的使用索引是改进SELECT操作性能的最好方法。
一个表最多可有16个索引。最大索引长度是256个字节,尽管这可以在编译MySQL时被改变。
对于CHAR和 VARCHAR列,你可以索引列的前缀。这更快并且比索引整个列需要较少的磁盘空间。对于BLOB和TEXT列,你必须索引列的前缀,你不能索引列的全部。
MySQL能在多个列上创建索引。一个索引可以由最多15个列组成。(在CHAR和VARCHAR列上,你也可以使用列的前缀作为一个索引的部分)。
虽然随着 MySQL 的进一步开发创建索引的约束将会越来越少,但现在还是存在一些约束的。下面的表根据索引的特性,给出了 ISAM 表和 MyISAM 表之间的差别:
表2-1 通道信息特征字对照表索引的特点 ISAM 表 MyISAM 表
NULL 值
BLOB 和 TEXT 列
每个表中的索引数
每个索引中的列数
最大索引行尺寸
不允许
不能索引
16
16
256 字节 允许
只能索引列的前缀
32
16
500 字节
从此表中可以看到,对于 ISAM 表来说,其索引列必须定义为 NOT NULL,并且不能对 BLOB 和 TEXT 列进行索引。MyISAM 表类型去掉了这些限制,而且减缓了其他的一些限制。两种表类型的索引特性的差异表明,根据所使用的 MySQL 版本的不同,有可能对某些列不能进行索引。例如,如果使用3.23 版以前的版本,则不能对包含 NULL 值的列进行索引。
索引有如下的几种情况:
INDEX索引:通常意义的索引,某些情况下KEY是它的一个同义词。索引的列可以包括重复的值。
UNIQUE索引:唯一索引,保证了列不包含重复的值,对于多列唯一索引,它保证值的组合不重复。
PRIMARY KEY索引:也UNIQUE索引非常类似。事实上,PRIMARYKEY索引仅是一个具有PRIMARY名称的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY。
用Alter Table语句创建与删除索引
为了给现有的表增加一个索引,可使用 ALTER TABLE 或CREATE INDEX 语句。ALTER TABLE 最常用,因为可用它来创建普通索引、UNIQUE 索引或 PRIMARY KEY 索引,如:
ALTER TABLE tbl_name ADD INDEX index_name (column_list)
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)
ALTER TABLE tbl_name ADD PRIMARY KEY index_name (column_list)
其中 tbl_name 是要增加索引的表名,而 column_list 指出对哪些列进行索引。一个(col1,col2,...)形式的列表创造一个多列索引。索引值有给定列的值串联而成。如果索引由不止一列组成,各列名之 间用逗号分隔。索引名 index_name 是可选的,因此可以不写它,MySQL 将根据第一个索引列赋给它一个名称。ALTER TABLE 允许在单个语句中指定多个表的更改,因此可以在同时创建多个索引。
同样,也可以用ALTER TABLE语句删除列的索引:
ALTER TABLE tbl_name DROP INDEX index_name
ALTER TABLE tbl_name DROP PRIMARY KEY
注意上面第一条语句可以用来删除各种类型的索引,而第三条语句只在删除 PRIMARY KEY 索引时使用;在此情形中,不需要索引名,因为一个表只可能具有一个这样的索引。如果没有明确地创建作为 PRIMARY KEY 的索引,但该表具有一个或多个 UNIQUE 索引,则 MySQL 将删除这些 UNIQUE 索引中的第一个。
如果从表中删除了列,则索引可能会受到影响。如果所删除的列为索引的组成部分,则该列也会从索引中删除。如果组成索引的所有列都被删除,则整个索引将被删除。
例如,对于上面所使用的student为例,你可能想为之创建这样的索引,以加速表的检索速度:
mysql> ALTER TABLE student
-> ADD PRIMARY KEY(id),
-> ADD INDEXmark(english,Chinese,history);
这个例子,既包括PRIMARY索引,也包括多列索引。记住,使用 PRIMARY索引的列,必须是一个具有NOT NULL属性的列,如果你愿意查看创建的索引的情况,可以使用SHOW INDEX语句:
mysql> SHOW INDEX FROM student;
其结果为:
+---------+------------+----------+--------------+-------------+-
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+---------+------------+----------+--------------+-------------+-
| student | 0 | PRIMARY | 1 | id |
| student | 1 | mark | 1 | english |
| student | 1 | mark | 2 | chinese |
| student | 1 | mark | 3 | history |
+---------+------------+----------+--------------+-------------+-
由于列数太多,上表并没有包括所有的输出,读者可以试着自己查看。
再使用ALTER TABLE语句删除索引,删除索引需要知道索引的名字,你可以通过SHOW INDEX语句得到:
mysql> ALTER TABLE student DROP PRIMARYKEY,
-> DROP INDEX mark;
再产看表中的索引,其语句和输出为:
mysql> SHOW INDEX FROM student;
Empty set (0.01 sec)
用CREATE\DROP INDEX创建索引
还可以用CREATE INDEX语句来创建索引.CREATE INDEX 是在 MySQL 3.23版中引入的,但如果使用3.23 版以前的版本,可利用 ALTER TABLE 语句创建索引(MySQL 通常在内部将 CREATE INDEX 映射到 ALTER TABLE)。该语句创建索引的语法如下:
CREATE UNIQUE INDEX index_name ON tbl_name(column_list)
CREATE INDEX index_name ON tbl_name(column_list) tbl_name、index_name 和 column_list 具有与 ALTER TABLE 语句中相同的含义。这里索引名不可选。很明显,CREATE INDEX 可对表增加普通索引或 UNIQUE 索引,不能用 CREATE INDEX 语句创建 PRIMARY KEY 索引。
可利用 DROP INDEX语句来删除索引。类似于 CREATE INDEX 语句,DROP INDEX 通常在内部作为一条 ALTER TABLE 语句处理,并且DROP INDEX是在 MySQL 3.22 中引入的。
删除索引语句的语法如下:
DROP INDEX index_name ON tbl_name
还是上一节的例子,由于CREATE INDEX不能创建PRIMARY索引,所以这里我们只创建一个多列索引:
mysql> CREATE INDEX mark ONstudent(english,chinese,history);
同样的检查student表,可知:
mysql> SHOW INDEX FROM student;
+---------+------------+----------+--------------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+---------+------------+----------+--------------+-------------+
| student | 1 | mark | 1 | english |
| student | 1 | mark | 2 | chinese |
| student | 1 | mark | 3 | history |
+---------+------------+----------+--------------+-------------+
然后使用下面的语句删除索引:
mysql> DROP INDEX mark ON student;
在创建表时指定索引
要想在发布 CREATE TABLE 语句时为新表创建索引,所使用的语法类似于 ALTER TABLE 语句的语法,但是应该在您定义表列的语句部分指定索引创建子句,如下所示:
与ALTER TABLE 一样,索引名对于 INDEX 和 UNIQUE 都是可选的,如果未给出,MySQL 将为其选一个。另外,这里KEY时INDEX的一个别名,具有相同的意义。
有一种特殊情形:可在列定义之后增加 PRIMARY KEY 创建一个单列的PRIMARY KEY 索引,如下所示:
该语句等价于以下的语句:
前面所有表创建样例都对索引列指定了 NOT NULL。如果是 ISAM 表,这是必须的,因为不能对可能包含 NULL 值的列进行索引。如果是 MyISAM 表,索引列可以为 NULL,只要该索引不是 PRIMARY KEY 索引即可。
在CREATE TBALE语句中可以某个串列的前缀进行索引(列值的最左边 n 个字符)。
如果对某个串列的前缀进行索引,应用 column_list 说明符表示该列的语法为 col_name(n) 而不用col_name。例如,下面第一条语句创建了一个具有两个 CHAR 列的表和一个由这两列组成的索引。第二条语句类似,但只对每个列的前缀进行索引:
你可以检查所创建表的索引:
mysql> SHOW INDEX FROM tbl_name;
+----------+------------+----------+--------------+-------------+-
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+----------+------------+----------+--------------+-------------+-
| tbl_name | 1 | name | 1 | name |
| tbl_name | 1 | name | 2 | address |
+----------+------------+----------+--------------+-------------+-
在某些情况下,可能会发现必须对列的前缀进行索引。例如,索引行的长度有一个最大上限,因此,如果索引列的长度超过了这个上限,那么就可能需要利用前缀进行索引。在 MyISAM 表索引中,对 BLOB 或 TEXT 列也需要前缀索引。
对一个列的前缀进行索引限制了以后对该列的更改;不能在不删除该索引并使用较短前缀的情况下,将该列缩短为一个长度小于索引所用前缀的长度的列。
总结
本节对索引的类型,已经如何创建索引做了介绍,其中涉及三个比较重要的SQL语句――ALTER TABLE、CREATE/DROP INDEX和CREATE TABLE,注意它们的用法。
索引最重要的功能是,通过使用索引加速表的检索,有关这方面的知识,将在第十章数据库优化中介绍。
思考题
1、建立一个如下所述的表:
data:FLOAT列,使用随机函数填充数据
birth:DATETIME列,填充当前时间。
然后,请录入几条数据。最后计算data列的平均值、总和、极值,并且按照data列降序排序检索值。
2、分别使用标准SQL模式和扩展正规表达式模式匹配,匹配上面创建的表,假设你创建表的当前日期为2001-01-01,用模式匹配检索出birth列包含该日期的值。(实际上,上面的表中记录都是同一日期录入的,因此实际将返回全部记录。)
3、为前几章使用的数据表创建索引:
student:为id段创建一个PRIMARY索引,为english、chinese和history创建一个多列索引。
pet:为name和owner段创建一个多类索引。
4、删除为pet表创建的索引。
##################################################
MySQL Index的使用
以下是理论知识备忘:
一、什么是索引?现在我们已经知道了一些如何选择索引列的知识,但还无法判断哪一个最有效。MySQL提供了一个内建的SQL命令帮助
一、 MySQL建表,字段需设置为非空,需设置字段默认值。
二、 MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。
三、 MySQL建表,如果字段等价于外键,应在该字段加索引。
四、 MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。
五、 MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段类型都可以索引,多列索引的属性最多15个。
六、 如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引唯一值最高的索引。
七、 建立索引index(part1,part2,part3),相当于建立了 index(part1),index(part1,part2)和index(part1,part2,part3)三个索引。
八、 MySQL针对like语法必须如下格式才使用索引:
SELECT * FROM t1 WHERE key_col LIKE ‘ab%‘ ;九、 SELECT COUNT(*) 语法在没有where条件的语句中执行效率没有SELECT COUNT(col_name)快,但是在有where条件的语句中执行效率要快。
十、 在where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引。
十一、 在where条件中多个or的条件中,每一个条件,都必须是一个有效索引。
十二、 ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序)。
十三、 所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的。
十四、 JOIN 索引,所有匹配ON和where的字段应建立合适的索引。
十五、 对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。
十六、 定期ANALYZE TABLE tbl_name为扫描的表更新关键字分布 。
十七、 定期使用慢日志检查语句,执行explain,分析可能改进的索引。
十八、 条件允许的话,设置较大的key_buffer_size和query_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M)。
标签:
原文地址:http://www.cnblogs.com/xdot/p/5098184.html