数据库-表的索引

表的索引-索引引言

目录 :索引的正确的使用方法,为啥? 你想想如果没有好的目录就没有吸引力 那一段话,让你感到印象深刻,比如说 ;我一定会回来的’该死的回忆杀啊 以前看喜灰时,好像每一集都能看到喜羊羊战胜敌人很明显编剧 也通过狼羊世界 也能看得出来狼.生存之道…,再怎么说也是食肉动物 当然野狼也开始寻找一条谋生之道 就是吃工业产物:火腿肠 以后上瘾 ,结果 网友你让我说这是狼? 不,这是早期驯化过来的狗的表现,? 把一系列 称之为 印象深刻 并且作为查询的便捷应急车道
我再说一个,原神 索引有很多 传送描点 地图的索引 这个称之为位置索引 剧情人物 想到派蒙 ,就是应急食品,最好的伙伴 想到蒙德 就想起那某位不干正事的酒蒙子 哈哈哈 自由自在 ,璃月会帝君遇刺封锁全场,没有摩拉的摩拉克斯 等等 每一个国家都多多少少印象深刻的回忆 想到烟花当然自然是 宵宫啦 总的来说索引是把关键词深入到事件,时间 然后根据事件与时间找到所找的

表的索引 创建,查看用没用索引

创建表 顺便创建索引

CREATE TABLE  tableName (
   colnumname  colnumtype   
   colnumname  colnumtype  , 
   colnumname  colnumtype   
   
     INDEX indexName colnumname (size)DESC |ASC),
     .....
  )
create table student1(
 id int  , 
 name VARCHAR(64),
 mainTeacher varchar(64),
 index  index_id(id desc));

创建表 之后 想增加索引

create index
create INDEX indexName on tableName (colnumname (size)DESC |ASC),
alter table
alter table tablename add index  indexName colnumname (size)DESC |ASC),
查看索引有没有生效

explain select *from tablename where 绑定的索引的列  条件;;

实例

#表索引创建,查看 普通索引
create DATABASE indexStudy;
use indexStudy;
#创建表 顺便创建索引
create table student1( id int  ,  name VARCHAR(64),mainTeacher varchar(64), index  index_id(id desc));

show create table student1;

alter table student1 add constraint id   primary key(id);
alter table student1 modify id  int AUTO_INCREMENT;

insert into student1(name,mainTeacher) values ('张三','wen');
insert into student1(name,mainTeacher) values ('章四','wen');

select *from student1 where id>0;
#查看索引有没有生效
explain select *from student1 where id>0;

# create index 方式
create table student2( id int  ,  name VARCHAR(64),mainTeacher varchar(64));

create index  index_id on student2(id desc);

insert into student2(id,name,mainTeacher) values (2,'张三','wen');
insert into student2(id ,name,mainTeacher) values (1,'章四','wen');
insert into student2 values(3,'王五','zhong');

select  *from student2 where id>0;
explain select *from student2 where id>0;

# alter table 方式
create table student3( id int ,  name VARCHAR(64),mainTeacher varchar(64));

alter table student3 add index index_id(id desc);

insert into student3(id,name,mainTeacher) values (2,'张三','wen');
insert into student3(id ,name,mainTeacher) values (1,'章四','wen');
insert into student3 values(3,'王五','zhong');
explain select *from student3 where id>0;

普通索引

CREATE TABLE  tableName (
   colnumname  colnumtype   
   colnumname  colnumtype  , 
   colnumname  colnumtype   
   
     INDEX indexName colnumname (size)DESC |ASC),
     .....
  )

没有附加属性的索引 (size)DESC |ASC), 创建索引 时 当遇到字符串 size 才生效 具体指定多大看需求 desc 是使用索引时才会降序排列,只有查询时指定索引对应的 列 条件 才能降序 默认是asc 也就是升序

use indexStudy;

drop Table student1;
drop Table student2;
drop Table student3;


create table student1( id int ,  name VARCHAR(64),mainTeacher varchar(64));

INSERT INTO student1 VALUES(1,'张三','luo');
insert into student1 values(2,'李四','wangfa');
insert into student1 values(3,'李四','wangfa');

select *from student1;

update student1 set name='王五' where id=3;
create index id_index on student1(id desc);

select *from student1 where id>0;

explain select *from student1 where id>0;
mysql> explain select *from student1 where id>0;
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
| id | select_type | table    | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | student1 | NULL       | range | id_index      | id_index | 5       | NULL |    3 |   100.00 | Using index condition |
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

EXPLAIN 语句输出解释

mysql> explain select * from student1 where id > 0;
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
| id | select_type | table    | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | student1 | NULL       | range | id_index      | id_index | 5       | NULL |    3 |   100.00 | Using index condition |
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)
  • id: 这个列表示查询中 SELECT 语句的序列号。因为这里只有一个 SELECT 语句,所以是 1。

  • select_type: 这个列显示了查询的类型。SIMPLE 表示查询不使用任何子查询或 UNION

  • table: 这个列是输出行所引用的表名。在这里是 student1

  • partitions: 这个列显示了查询中使用的分区。如果没有分区,则为 NULL

  • type: 这个列指示了连接类型。range 表示查询在索引上使用范围扫描。这通常比全表扫描要好,但不如唯一或 ref 查找。

  • possible_keys: 这个列显示了 MySQL 可以选择用来查找表中的行的索引。id_index 是 MySQL 可以用于此查询的索引。

  • key: 这个列显示了 MySQL 实际决定使用的索引。在这里是 id_index

  • key_len: 这个列显示了 MySQL 决定使用的键的长度。值 5 表明索引可能是在一个整数列上(因为一个 INT 通常是 4 个字节,可能还有一个字节用于符号)。

  • ref: 这个列显示了与索引键进行比较的列或常量。如果没有比较,则为 NULL

  • rows: 这个列显示了 MySQL 估计需要检查的行数来执行查询。值 3 是一个估计,可能不准确。

  • filtered: 这个列显示了通过条件过滤的行百分比。100.00 表示在索引查找后没有应用过滤。

  • Extra: 这个列包含了有关查询执行计划的额外信息。Using index condition 表示索引用于访问表,并且条件在索引查找后应用。

查看 key 列。如果 key 列显示的是你期望的索引名称,那么索引已经生效。

唯一索引

很明显限制了玩原神(米游)的朋友 设备必须只有一台登录 当设备(安卓,iOS, 鸿蒙. win ,PS)登录到原神 就直接被激活 这不就是唯一的索引? 由于理解过于简单

CREATE TABLE  tableName (
   colnumname  colnumtype   
   colnumname  colnumtype  , 
   colnumname  colnumtype   
   
    unique INDEX indexName colnumname (size)DESC |ASC),
     .....
  )

当然创建唯一索引有三种 和普通索引一样 创建表时创建 . 创建完表之后创建唯一索引 通过alter table add 方式

实例

 use indexStudy;

 drop Table student1;

# 创建表 name字段 没有唯一约束
 create table student1(id int, name varchar(64),mainTacher varchar(64));
insert into student1 values(1,'张三','hei');
insert into student1 values(2,'王三','hei');
insert into student1 values(3,'李三','hei');

create unique index index_name on student1(name);

select *from student1;

show create table student1;
 explain select *from student1 where name = ('李三');
 select *from student1 where name like('%三');
# 创建表 name字段 有唯一约束
create table student2(id int ,name varchar(64) ,mainTacher varchar(64), unique key(name));

insert into student2 values(1,'张三','hei');
insert into student2 values(2,'王三','hei');
insert into student2 values(3,'李三','hei');

create unique index index_name on student2(name);

explain select *from student2 where name='张三';

show create table student2;
/*

possible_keys
name,index_name 有两个索引 

CREATE TABLE `student2` (
  `id` int DEFAULT NULL,
  `name` varchar(64) DEFAULT NULL,
  `mainTacher` varchar(64) DEFAULT NULL,
  UNIQUE KEY `name` (`name`),
  UNIQUE KEY `index_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/
# 当使用  UNIQUE KEY 的字段时自动为该字段建立唯一索引   因为插入数据判断 这个数据存在唯一索引? 当然没有数据时,新建 name 的唯一索引
/*
可能是这样的形式
-----
name
-------
|张三|
|李三|
|王三|
-------
存放磁盘里 通过哈希 值调度 或者说分配硬盘里 有可能是这样的存储  当然MySQL默认使用的索引结构是B树 ;
*/

全文索引

在搜索引擎里搜索’张三’
在这里插入图片描述

这两个字会发现是一个代称 额不开玩笑了 当搜索引擎搜索’张三’时 会做一个索引凡事包含’'张三""的都给你用红字标记了
全文索引就是建立一个特殊的标记点 方便以后查询 凡事有张三出镜的机会 豪不掩盖 那么图片里有多少个张三?
那么概念已经了解

实例

use indexStudy;

# 全文索引
create table textDemo( id int ,Tx varchar(128) );


insert into textdemo values(1,'我今天就要带她走 我看谁敢阻止我 !');
insert into textdemo values(2,'我自横刀向天笑 去留肝胆两昆仑');
insert into textdemo values(3,'下蛋公鸡 公鸡中的战斗鸡on yes ');
insert into Textdemo values(4,'天空好像下雨 我好想住你隔壁');
INSERT INTO Textdemo VALUES(5,'I m zhongli ');

alter table TextDemo add fulltext index txIndex(Tx);
show create table Textdemo;
#查询方法
select *from  textdemo where match(Tx)against('天');
select *from Textdemo where match(tx)against('下蛋公鸡');
select *from Textdemo where match(tx)against('I m ');

mysql> show create table Textdemo;
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                            |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Textdemo | CREATE TABLE `textdemo` (
  `id` int DEFAULT NULL,
  `Tx` varchar(128) DEFAULT NULL,
  FULLTEXT KEY `txIndex` (`Tx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select *from  textdemo where match(Tx) against('天');
Empty set (0.00 sec)

mysql> select *from Textdemo where match(tx)against('下蛋公鸡');
+------+--------------------------------+
| id   | Tx                             |
+------+--------------------------------+
|    3 | 下蛋公鸡 公鸡中的战斗鸡on yes  |
+------+--------------------------------+
1 row in set (0.00 sec)

mysql> select *from Textdemo where match(tx)against('I m ');
Empty set (0.00 sec)

mysql> select *from textdemo where match(tx)against('zhongli');
+------+-------------+
| id   | Tx          |
+------+-------------+
|    4 | I m zhongli |
+------+-------------+
1 row in set (0.00 sec)

mysql>

全文索引下的查询语句

select *from where match(包含全文索引的列)against(.'查询用的子串');

在解决windows 系统全文索引匹配 中文问题

在Windows系统上

  1. 定位配置文件:
    MySQL的配置文件通常位于MySQL安装目录下,文件名为my.ini。
    默认路径可能是C:\ProgramData\MySQL\MySQL Server X.Y\,其中X.Y是MySQL的版本号。
  2. 编辑配置文件:
    使用文本编辑器(如记事本)打开配置文件。
    在[mysqld]部分添加或修改ngram_token_size参数。例如:

ini

[mysqld]
ngram_token_size=2

3.重启MySQL服务:
保存配置文件后,需要重启MySQL服务以使更改生效。
可以通过“服务”管理器(services.msc)找到MySQL服务,右键选择“重启”,或者使用命令提示符:

cmd

net stop MySQL
net start MySQL

多列索引

在没有任意的约束(唯一,非空,)列,可设置成多列索引就 查询速度加快.

  use indexStudy;
# 多列索引
  create table dome(id int,txts varchar(64) , txtins varchar(64));
  insert into  dome values(1,'a','啊');
  insert into dome values(2,'ai','唉');
  insert into dome values(3,'an','安');

  create index domeMutCow on dome(id , txtins);
select *from dome where id =1;
explain select *from dome where id >0;

# 两个一起查询时 加and
select *from dome where id =1 and txtins='啊';
select *from dome where Txtins ='安';       
explain select *from dome where Txtins ='安';       
 explain select *from dome where id =1 and txtins='啊';
# 当多列索引 被运用按照排创建索引顺序 列顺序 查询才有效 所以 explain select *from dome where Txtins ='安'; 并不具备索引条件 
#要么n个一起  

多列索引查询 注意事项
1.组合使用: 当查询条件同时包含索引中所有列时,数据库会利用多列索引进行优化。例如,id = 1 and txtins = ‘啊’ 会使用 domeMutCow 索引。
2.部分使用: 如果查询只包含索引中的部分列,数据库可能无法有效利用多列索引。例如,txtins = ‘安’ 不会使用 domeMutCow 索引,因为索引的顺序是 id 在前,txtins 在后。
3.索引顺序: 多列索引的列顺序很重要。查询条件中列的顺序应与索引中列的顺序一致,才能有效利用索引。

隐藏表索引

假设有这么一个表索引 对于项目来说可能用得到, 有可能用不到 用不到也可以不强行删除 这个时候隐藏表索引就即可

##隐藏索引
  alter table '表名' alter index  '对应的表索引' invisible;
## 取消 隐藏索引
  alter table '表名' alter index  '对应的表索引' visible;
##隐藏索引
  alter table dome alter index  domeMutCow invisible;
#再查看创建表语句
  show create table  dome; 
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
                                |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dome  | CREATE TABLE `dome` (
  `id` int DEFAULT NULL,
  `txts` varchar(64) DEFAULT NULL,
  `txtins` varchar(64) DEFAULT NULL,
  KEY `domeMutCow` (`id` DESC,`txtins`) /*!80000 INVISIBLE */
  
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

# 取消隐藏
  alter table dome alter index  domeMutCow visible;

删除表索引

你认为某些表索引需要 删除后再创建才能达到 修改 那么也可行 当然你认为在某个表存在索引感觉有点怪 那么可以大胆的删除

drop index indexName on tableName;
drop index domeMutCow` on dome ;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值