百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

mysql的表索引相关(mysql索引的用法)

wptr33 2025-05-03 16:58 2 浏览

索引的创建以及删除

1.alter table

2.create/drop index

mysql> create index idx_b on t (cls_id);
ERROR 1072 (42000): Key column 'cls_id' doesn't exist in table

desc方式查看

mysql> desc students;
+------------+-----------------+------+-----+---------+----------------+
| Field      | Type            | Null | Key | Default | Extra          |
+------------+-----------------+------+-----+---------+----------------+
| id         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| created_at | datetime(3)     | YES  |     | NULL    |                |
| updated_at | datetime(3)     | YES  |     | NULL    |                |
| deleted_at | datetime(3)     | YES  | MUL | NULL    |                |
| sno        | bigint          | YES  |     | NULL    |                |
| pwd        | varchar(32)     | NO   |     | NULL    |                |
| tel        | varchar(12)     | NO   |     | NULL    |                |
| birth      | datetime(3)     | YES  |     | NULL    |                |
| cls_id     | bigint          | YES  | MUL | NULL    |                |
+------------+-----------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
show create table 方式查看
mysql> show create table students;
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| students | CREATE TABLE `students` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `deleted_at` datetime(3) DEFAULT NULL,
  `sno` bigint DEFAULT NULL,
  `pwd` varchar(32) NOT NULL,
  `tel` varchar(12) NOT NULL,
  `birth` datetime(3) DEFAULT NULL,
  `cls_id` bigint DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_students_deleted_at` (`deleted_at`),
  KEY `idx_b` (`cls_id`)
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> show index from students
    -> ;
+----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table    | Non_unique | Key_name                | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| students |          0 | PRIMARY                 |            1 | id          | A         |          45 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| students |          1 | idx_students_deleted_at |            1 | deleted_at  | A         |           1 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
| students |          1 | idx_b                   |            1 | cls_id      | A         |           2 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
+----------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
3 rows in set (0.04 sec)

索引核心是降低io的操作

explain select的查询序列号

1.数字越小,表示最外面

2.数字越大表示优先级最高(最里面的先执行)

3.数字相同表示是同一组的 同一组里的按顺序来从上到下执行

mysql> explain select * from su a ,(select c2 from su where id=10) b where a.c2=b.c2;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+-------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows  | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+-------+----------+-------------+
|  1 | SIMPLE      | su    | NULL       | const | PRIMARY       | PRIMARY | 4       | const |     1 |   100.00 | NULL        |
|  1 | SIMPLE      | a     | NULL       | ALL   | NULL          | NULL    | NULL    | NULL  | 87778 |    10.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+-------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

4.当type 中出现了all 表示走了全表扫描 possible_keys (可能用到的索引) key(索引名称) rows (扫描的行数 一般超过5000行就有问题需要进行优化)

5.update 或者delete也会使用到对应的索引(select,update,delete都是能加速的)


索引分为单列索引和联合索引

创建方法: create index idx_c3_c4 on su(c3,c4)

查看索引的信息:

mysql> show index from su;
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| su    |          0 | PRIMARY   |            1 | id          | A         |      472487 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| su    |          1 | idx_c2    |            1 | c2          | A         |      305177 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| su    |          1 | idx_c3_c4 |            1 | c3          | A         |      304103 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| su    |          1 | idx_c3_c4 |            2 | c4          | A         |      305613 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
4 rows in set (0.03 sec)

查询

mysql> explain select * from su where c3="222";  #用到索引了
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key       | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | su    | NULL       | ref  | idx_c3_c4     | idx_c3_c4 | 4       | const |    2 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)

mysql> explain select * from su where c4="222";    #当使用c4查询时没有使用到对应的索引
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | su    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 472487 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

 explain select * from su where c4="222" order by c3;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
|  1 | SIMPLE      | su    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 472487 |    10.00 | Using where; Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from su where c3="222" order by c4;
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key       | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | su    | NULL       | ref  | idx_c3_c4     | idx_c3_c4 | 4       | const |    2 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
#all 运算符没有使用到索引
mysql> explain select * from su where c3="222" or c4="123";
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | su    | NULL       | ALL  | idx_c3_c4     | NULL | NULL    | NULL | 472487 |    19.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

总结: 1.创建联合索引时 最左前缀原则 当单独使用c4时是无法使用索引的

2.在orderby 进行排序时也是遵循最左前缀原则的 走索引(c3必须在前面才行)

3.or 关键字在联合索引中不起作用(单列索引是可以) index merge(索引的合并),只能用一个索引(同时使用到单列和联合索引) 转化为 合并索引

4.不支持中文索引,但是支持全文索引如何创建全文索引

5.索引中不会包含有null值的列,当使用count(*)时对null值不走,对于创建索引时我们建议创建非空字段 不建议在null上的字段简历索引

6.在进行select语句时不要进行函数运算 ,否则你创建索引了也用不到索引

mysql> create index idx_c4 on su(c4);
Query OK, 0 rows affected (3.83 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select * from su where c3="222" or c4="123";
+----+-------------+-------+------------+-------------+------------------+------------------+---------+------+------+----------+-------------------------------------------------+
| id | select_type | table | partitions | type        | possible_keys    | key              | key_len | ref  | rows | filtered | Extra                                           |
+----+-------------+-------+------------+-------------+------------------+------------------+---------+------+------+----------+-------------------------------------------------+
|  1 | SIMPLE      | su    | NULL       | index_merge | idx_c3_c4,idx_c4 | idx_c3_c4,idx_c4 | 4,4     | NULL |    3 |   100.00 | Using sort_union(idx_c3_c4,idx_c4); Using where |
+----+-------------+-------+------------+-------------+------------------+------------------+---------+------+------+----------+-------------------------------------------------+
1 row in set, 1 warning (0.01 sec)

删除索引: alter table su drop index idx_c4;

mysql> ALTER TABLE su drop index idx_c4;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

尽量少使用or 否则就健单列索引

全文索引

create fulltext index idx_su on su(1);

覆盖索引

通过索引即可查到数据(就是覆盖素引) Extra 中使用 Usingindex

查询列就是索引列

mysql> explain select c2 from su where c2=123;
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key    | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | su    | NULL       | ref  | idx_c2        | idx_c2 | 4       | const |    1 |   100.00 | Using index |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------------+

当extra 中使用的是 filesort 时需要优化

函数运算索引

mysql> explain select * from su where YEAR(C5)<2007;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | su    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 497738 |   100.00 | Using where |
+----+-------------+-------+---------
  
  未使用函数时
  mysql> explain select * from su where C5<"2007-12-12:14:00";
+----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key    | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | su    | NULL       | range | idx_c5        | idx_c5 | 4       | NULL |    1 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
1 row in set, 2 warnings (0.00 sec)

1.提高排队效率

2.创建索引在非null的字段上进行创建,在有null的字段会扫描对应 的null数据

3.联合索引降低搜索的范围(单行索引和联合索引没有绝对的好与不好)

1.通过索引 扫描超过30%时走全表扫描

2.函数 以及模糊匹配时无法使用索引 like 语句

3.不综训最左前缀原则不走索引

4.两个单读索引 一个用排序 orderby 需要创建联合索引


相关推荐

删库不跑路!我含泪写下了 MySQL 数据恢复大法…

1前言数据恢复的前提的做好备份,且开启...

mysqldump备份操作大全及相关参数详解

mysqldump简介mysqldump是用于转储MySQL数据库的实用程序,通常我们用来迁移和备份数据库;它自带的功能参数非常多,文中列举出几乎所有常用的导出操作方法,在文章末尾将所有的参数详细说明...

MySQL表中没有主键,怎么找到重复的数据

在没有主键的MySQL表中查找重复数据可能会有点复杂,但通过使用下述方法中的任何一种,你都应该能够识别并处理这些重复项。在MySQL中,没有主键的表可能会存在重复的数据行。为了找到这些重复的数据,你可...

MySql 大数据 批量删除 Hint 操作

业务中有会碰到数据库中大量冗余数据的情况。比如压测场景,这个时候就需要我们去清理这些数据。怎么操作呢?这个时候mysql的hint就可以派上用场了,直接上语句:DELETE/*+QU...

Linux卸载MySQL教程(linux 卸载数据库)

在Linux系统中,卸载MySQL需要执行以下步骤:停止MySQL服务在卸载MySQL之前,需要先停止MySQL服务,可以使用以下命令停止MySQL服务:sudosystemctlstopmys...

用SQL语句删除数据库重复数据,只保留一条有效数据

原文链接http://t.zoukankan.com/c-Ajing-p-13448349.html在实际开发中,可能会遇到数据库多条数据重复了,此时我们需要删除重复数据,只保留一条有效数据,用SQ...

Mybatis 如何批量删除数据(mybatis删除多条数据)

Mybatis如何批量删除数据本期以最常用的根据id批量删除数据为例:接口设计1:List类型单参数IntegerdeleteByIds(List<Integer>ids);...

MySQL常用命令汇总(mysql数据库常用命令总结)

以下是一份MySQL常用命令汇总,涵盖数据库、表、数据操作及管理功能,方便快速查阅:一、数据库操作1.连接数据库```bash...

「删库跑路」使用Binlog日志恢复误删的MySQL数据

前言“删库跑路”是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路!开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你能够了解到:MySQL...

MySQL查询是否安装&amp;删除(判断mysql是否安装)

1、查找以前是否装有mysql命令:rpm-qa|grep-imysql可以看到如下图的所示:...

windows版MySQL软件的安装与卸载(windows卸载mysql5.7)

一、卸载1、软件的卸载方式一:通过控制面板方式二:通过电脑管家等软件卸载方式三:通过安装包中提供的卸载功能卸载...

使用 SQL 语句将 Excel VBA 中的表格修改为 MySQL 数据库

在ExcelVBA中与MySQL数据库进行交互时,通常需要使用ADODB连接来执行SQL语句。以下是一个完整的示例,展示了如何将Excel表格中的数据插入到MySQL数据库的...

MySql数据库Innodb引擎删除一行数据会在内存上留下空洞吗

当使用InnoDB引擎删除一行数据时,实际上并不会在内存上留下空洞。InnoDB存储引擎采用了多版本并发控制(MVCC)机制来实现事务的隔离性,每行记录都会保存两个隐藏列,一个保存行的创建版本,另一个...

MySQL批量生成建表语句(mysql 批量新增)

摘要:MySQL批量生成建表语句关键词:MySQL、大批量、挑选、建表语句整体说明在使用MySQL的时候,遇到需要在大批量的表中,挑选一部分表,权限又只有只读权限,工具又没有合适的,最终使用了My...

MySQL数据库之死锁与解决方案(mysql解决死锁的三种方法)

一、表的死锁产生原因:...