索引篇
索引,索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。。
优点:
所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引
大大加快数据的查询速度
缺点:
创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加
索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值
当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。
使用原则:
通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。
1、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,
2、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
3、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。
1. 普通索引
缺点:
-
提高了查询效率 但是降低了增删改的效率
-
索引文件 占用磁盘空间
01 –直接创建索引 02 CREATE INDEX index_name ON table(column(length)) 03 –修改表结构的方式添加索引 04 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) 05 –创建表的时候同时创建索引 06 CREATE TABLE `table` ( 07 `id` int(11) NOT NULL AUTO_INCREMENT , 08 `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 09 `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 10 `time` int(10) NULL DEFAULT NULL , 11 PRIMARY KEY (`id`), 12 INDEX index_name (title(length)) 13 ) 14 –删除索引 15 DROP INDEX index_name ON table
2. 唯一索引
唯一索引和主键索引 都一样 不能插入重复的值 不同的是 主键一个表只能存在一个 唯一索引可以存在多个
创建唯一索引
01 –创建唯一索引 02 CREATE UNIQUE INDEX indexName ON table(column(length)) 03 –修改表结构 04 ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)) 05 –创建表的时候直接指定 06 CREATE TABLE `table` ( 07 `id` int(11) NOT NULL AUTO_INCREMENT , 08 `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 09 `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 10 `time` int(10) NULL DEFAULT NULL , 11 PRIMARY KEY (`id`), 12 UNIQUE indexName (title(length))
注意:
-
每个表中 只能有一个主键索引
-
每个表中最好有一个主键索引 并不是必须的
-
主键索引可以有很多的候选项 (auto_increment,not null)
-
当表中的数据 被删除以后 auto_increment 依然记录着下一个数据插入的行号值
-
truncate 表名 清空表 并将自增归位
-
alter 表名 auto_increment=1
-
创建主键索引
mysql> create table myindex( -> id int unsigned primary key auto_increment not null -> );
4 全文索引(FULLTEXT)
MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。////对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
01 –创建表的适合添加全文索引 02 CREATE TABLE `table` ( 03 `id` int(11) NOT NULL AUTO_INCREMENT , 04 `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 05 `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 06 `time` int(10) NULL DEFAULT NULL , 07 PRIMARY KEY (`id`), 08 FULLTEXT (content) 09 ); 10 –修改表结构添加全文索引 11 ALTER TABLE article ADD FULLTEXT index_content(content) 12 –直接创建索引 13 CREATE FULLTEXT INDEX index_content ON article(content)
alter table 表名 engine=表存储类型
-
MyISAM表的存储文件为3个 InnoDB为2个
-
MyISAM不支持事物 innodb支持
-
MyISAM不支持外键 innodb支持
-
MyISAM表的查询效率高于innodb 但是innodb的安全性高于MyISAM
(1) MyISAM的文件说明
-
.frm文件 存储当前表结构的文件
在innodb和MyISAM中都存在
-
.MYD: 即MY DATA 存储表数据的文件
-
.MYI:即 MY INDEX 存储表索引的文件
(2) InnoDB的文件说明
-
.frm文件 存储当前表结构的文件
在innodb和MyISAM中都存在
-
.ibd 存储表数据和索引
事物篇
-
alter table 表名 engine=innodb;
-
查看当前表的提交类型
select @@autocommit
如果值为1 则为自动提交
-
改为手动提交(开启事物)
set autocommit=0
-
事物开始
begin;
-
执行各种SQL语句
-
提交或者回滚
-
commit work;
-
rollback work;
-