定义:一个数据文件的存储机制
学习到的是MyISAM、InnoDB、MEMORY、ARCHIVE等
不支持外键不支持事务支持全文索引表锁对于一些在线分析处理操作速度快
支持外键
支持事务
不支持全文索引
行锁
主要是面向在线事务处理方面的应用,采用聚集索引的方式。没有主键没有唯一键,为每一行生产一个6字节的行id,作为主键。varchar类型当作char类型(提高效率)
不支持大文本字段和图片类型
将数据存放在内存中,如果数据库重启或宕机,表数据就会丢失。非常适合存储一些临时表,默认的是哈希索引,不是B+树索引,varchar()默认是按照char()存储的,可以省内存,提高效率。如果数据中有text、blob类型,MEMORY不处理大字段类型,将转交给MyISAM处理,导致这部分一般在磁盘一般在内存,效率大大降低。索引是一种数据结构不是一个搜索方法
从一个1000w条信息的数据库中找到名字是张三的信息
select *from tbname where name=“张三”;
关于MySQL索引的好处,如果正确合理设计并且使用索引的mysql是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。其多个数据表都会对经常被查询的字段添加索引
MySQL索引的概念
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。如果我们把SQL语句换成“SELECT * FROM article WHERE id=2000000”,那么你是希望数据库按照顺序读取完200万行数据以后给你结果还是直接在索引中定位呢?上面的两个图片鲜明的用时对比已经给出了答案(注:一般数据库默认都会为主键生成索引)。
索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。
这是最基本的索引,它没有任何限制, MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。
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 TABLEtable
(
07id
int(11) NOT NULL AUTO_INCREMENT ,
08title
char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
09content
text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
10time
int(10) NULL DEFAULT NULL ,
11 PRIMARY KEY (id
),
12 INDEX index_name (title(length))
13 )
14 –删除索引
15 DROP INDEX index_name ON table
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
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 TABLEtable
(
07id
int(11) NOT NULL AUTO_INCREMENT ,
08title
char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
09content
text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
10time
int(10) NULL DEFAULT NULL ,
11 PRIMARY KEY (id
),
12 UNIQUE indexName (title(length))
13 );
MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
01 –创建表的适合添加全文索引
02 CREATE TABLEtable
(
03id
int(11) NOT NULL AUTO_INCREMENT ,
04title
char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
05content
text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
06time
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)
平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:
1 –使用到上面的索引
2 SELECT * FROM article WHREE title=‘测试’ AND time=1234567890;
3 SELECT * FROM article WHREE utitle=‘测试’;
4 –不使用上面的索引
5 SELECT * FROM article WHREE time=1234567890;
定义:满足ACID四个特性则称为事务。
A | 原子性 |
---|---|
C | 一致性 |
I | 隔离性 |
D | 持久性 |
本文发布于:2024-02-01 14:04:05,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170676744537121.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |