|NO.Z.00142|——————————|BigDataEnd|——|Java&MySQL.高级.V14|——|MySQL.v14|什么是索引|

一、MySQL索引优化
### --- 索引简介

~~~     # 什么是索引
——>        索引就是排好序的,帮助我们进行快速查找的数据结构.
——>        简单来讲,索引就是一种将数据库中的记录按照特殊形式存储的数据结构。
——>        通过索引,能够显著地提高数据查询的效率,从而提升服务器的性能.
——>        专业一点来说呢,索引是一个排好序的列表,
——>        在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。
——>        在数据库十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用
——>        扫描全表来定位某行的数据,
——>        而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。
~~~     # 没有用索引时执行 select * from where t.Col2 = , 
——>        数据从磁盘一条一条拿去最终找到结果,效率低下。

~~~     # 为了加快查找,可以维护一个二叉树,左侧节点小于父节点, 
——>        右侧节点大于父节点,每个节点分别保存字段数据和一个指向对应数据记录物理地址的指针.

~~~     # 查找时 就可以使用二叉树查找获取相应的数据,
——>        从而快速检索出符合条件的记录一般来说索引本身也比较大,不可能全部保存在内存中,
——>        因此索引通常是以索引文件的形式存储在磁盘上
二、索引的种类
### --- 普通索引
——>        这是最基本的索引类型,基于普通字段建立的索引,没有任何限制。

CREATE INDEX <索引的名字> ON tablename (字段名);
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名);
CREATE TABLE tablename ( [...], INDEX [索引的名字] (字段名) );
### --- 唯一索引
——>        与"普通索引"类似,不同的就是:索引字段的值必须唯一,但允许有空值 。

CREATE UNIQUE INDEX <索引的名字> ON tablename (字段名);
ALTER TABLE tablename ADD UNIQUE INDEX [索引的名字] (字段名);
CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (字段名) ;
### --- 主键索引
——>        它是一种特殊的唯一索引,不允许有空值。在创建或修改表时追加主键约束即可,每个表只能有一个主键。

CREATE TABLE tablename ( [...], PRIMARY KEY (字段名) );
ALTER TABLE tablename ADD PRIMARY KEY (字段名);
### --- 复合索引
——>        用户可以在多个列上建立索引,这种索引叫做组复合索引(组合索引)。
——>        复合索引可以代替多个单一索引,相比多个单一索引复合索引所需的开销更小。

CREATE INDEX <索引的名字> ON tablename (字段名1,字段名2...);
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名1,字段名2...);
CREATE TABLE tablename ( [...], INDEX [索引的名字] (字段名1,字段名2...) );
三、复合索引使用注意事项:
### --- 复合索引使用注意事项:

~~~     # 何时使用复合索引,要根据where条件建索引,注意不要过多使用索引,
——>     过多使用会对更新操作效率有很大影响。
~~~     # 如果表已经建立了(col1,col2),就没有必要再单独建立(col1);
——>     如果现在有(col1)索引,如果查询需要col1和col2条件,
——>     可以建立(col1,col2)复合索引,对于查询有一定提高。

四、全文索引

### --- 全文索引
~~~     # 查询操作在数据量比较少时,可以使用like模糊查询,
~~~     但是对于大量的文本数据检索,效率很低。如果使用全文索引,
~~~     查询速度会比like快很多倍。在MySQL 5.6 以前的版本,
~~~     只有MyISAM存储引擎支持全文索引,从MySQL 5.6开始MyISAM和InnoDB存储引擎均支持。

CREATE FULLTEXT INDEX <索引的名字> ON tablename (字段名);
ALTER TABLE tablename ADD FULLTEXT [索引的名字] (字段名);
CREATE TABLE tablename ( [...], FULLTEXT KEY [索引的名字] (字段名) ;
~~~     # 全文索引方式有自然语言检索 IN NATURAL LANGUAGE MODE 和
~~~     布尔检索 IN BOOLEAN MODE两种和常用的like模糊查询不同,
~~~     全文索引有自己的语法格式,使用 match 和 against 关键字,比如

SELECT * FROM users3 WHERE MATCH(NAME) AGAINST('aabb');
-- * 表示通配符,只能在词的后面
SELECT * FROM users3 WHERE MATCH(NAME) AGAINST('aa*'  IN BOOLEAN MODE);
### --- 全文索引使用注意事项:

——>        全文索引必须在字符串、文本字段上建立。
——>        全文索引字段值必须在最小字符和最大字符之间的才会有效。(innodb:3-84;myisam:4-84)

五、sql语句

~~~     # 主键索引 普通索引 唯一索引

CREATE TABLE user1(
    id INT (11) PRIMARY KEY,
    NAME VARCHAR(20),
    card VARCHAR(50),
    INDEX idx_name(NAME),
    UNIQUE idx_card(card)
);
~~~     # 复合索引

CREATE TABLE user2(
    id INT(11) PRIMARY KEY,
    NAME VARCHAR(20),
    card VARCHAR(30),
    INDEX idx_name_card(NAME,card)
);
~~~     # 全文索引

CREATE TABLE user3(
    id INT(11) PRIMARY KEY,
    NAME VARCHAR(20),
    FULLTEXT KEY full_idx_name(NAME)
);

~~~     # 查询输出
SELECT * FROM user3 WHERE MATCH(NAME) AGAINST('aabb');

SELECT * FROM user3 WHERE MATCH(NAME) AGAINST('aa*' IN BOOLEAN MODE);

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

 

posted on   yanqi_vip  阅读(20)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示