索引是用来加快从数据库中查询数据的速度的。

需要注意的是索引的使用会增加插入和更新的时间,因为在插入数据的同时也会更新索引。所以在创建索引时确保只在那些频繁作为查询条件的列中增加。

创建索引

创建索引时有几个需要注意的点:

不要在频繁写,而读取频率较低的表上使用索引,和之前说的那样,索引提高了读速度,而损耗了写速度

不要在 low cardinality 的列上使用索引,Cardinality 直接翻译是基数,可以理解成为这一列取值的散列程度,如果一个列包含的值只有少数几个,那么索引的效果也无法达到

不要在固定大小的表上使用索引,小数量集的表增加索引并不会带来多大的性能提升,所以尤其需要注意的是那些可能随着时间数据量增长很快的表,比如 users 表

在建表时

CREATE INDEX idx_name ON table_name(column1, column2);

ALTER TABLE `table_name` ADD INDEX idx_name (`column1`);

创建唯一索引

ALTER TABLE `table_name` ADD UNIQUE uni_name (`column1`)

显示查看索引

查看表索引

SHOW INDEX FROM table_name;

在查询的结果中可以看到索引的名字,列名,散列程度(Cardinality),索引类型(BTREE) 等等。

查询 Schema 中所有的索引

SELECT DISTINCT

TABLE_NAME,

INDEX_NAME

FROM INFORMATION_SCHEMA.STATISTICS

WHERE TABLE_SCHEMA = 'your_schema';

删除索引

DROP INDEX idx_name ON table_name;

ALTER TABLE table_name DROP INDEX idx_name;

Single index vs Composite index

组合索引和单一索引一样,不过组合索引是需要组合多列。

假设有用户表 users

ID | first_name | last_name | class | position |

--------------------------------------------------------

1 | Teemo | Shroomer | Specialist | Top |

2 | Cecil | Heimerdinger | Specialist | Mid |

3 | Annie | Hastur | Mage | Mid |

4 | Fiora | Laurent | Slayer | Top |

5 | Garen | Crownguard | Fighter | Top |

然后在 class 和 position 列上创建组合索引

CREATE INDEX class_pos_index ON users (class, position);

然后数据库会创建一个组合索引的排序,类似:

class-position Primary Key

--------------------------------

AssassinMid -> 10

ControllerSupport -> 16

ControllerSupport -> 18

ControllerSupport -> 8

FigherTop -> 7

FigherTop -> 9

FighterJungle -> 13

FighterJungle -> 21

FighterJungle -> 23

假设需要查询班级中的 Top,那么会提升速度:

SELECT * FROM users

WHERE

class = 'Specialist'

AND

position = 'Top';

因为按照了 class-position 来排序,所以查询速度得到了提升。数据库能够在 O(log_2(n)) 时间内查找到 Specialist-Top 而不需要读取全表。

需要注意的是即使查询条件只有 class 字段,组合索引依然能够提升速度,因为class 在组合索引的第一个位置。

但是单纯的查询 position

SELECT * FROM users WHERE position = 'Top';

则享受不到组合索引带来的好处。所以组合索引的列顺序非常关键。

创建组合索引的一些注意点:

如果特定列固定的出现在查询条件中,那么对这些列创建组合索引比较好

如果要创建 field1 上的索引,也要创建 (field1, field2) 上的索引,那么只创建一个组合索引 (field1, field2) 已经足够

和 Single indexes 一样,组合索引的 Cardinality 一样重要。显然当两个 field 有高的 Cardinality,组合索引的 Cardinality 也会很高。但是某一些情况下低 Cardinality 的列也会有高的 Cardinality 组合索引

reference

mysql in语句 索引,MySQL 中索引相关 SQL 语句相关推荐

  1. ef执行原生sql语句_EF Core中执行原生SQL语句

    一.课程介绍之所以今天录制这个系列文章的主要原因是,想在快速帮助到大家上手在ASP.NET Core WebAPI中结合EF Core来操作我们的数据库.EF Core的基础文章和基础课程实在是太多了 ...

  2. mysql导出不带注释的sql语句_MySQL mysqlbinlog解析出的SQL语句被注释是怎么回事

    MySQL mysqlbinlog解析出的SQL语句被注释是怎么回事 一网友反馈使用mysqlbinlog解析出的二进制日志中的内容中,有些SQL语句有#注释的情况,这个是怎么回事呢?我们通过实验来了 ...

  3. mysql 如何优化sql语句,如何优化SQL?MySQL中超实用的SQL语句送给大家

    如何优化SQL?MySQL中超实用的SQL语句送给大家 如何优化SQL?MySQL中超实用的SQL语句送给大家 在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑.减少程序与数据 ...

  4. 如何找出MySQL数据库中的低效SQL语句

    面对业务的迅猛发展,DBA的一项重要工作就是及时发现数据库中的低效SQL语句,有的可以立刻着手解决(比如缺少合适的索引),有的需要尽快反馈给开发人员进行修改. MySQL数据库有几个配置选项可以帮助我 ...

  5. ​MYSQL中常用的SQL语句​(增删改查)

    MYSQL中常用的SQL语句 一.增删改查 1.新增 指定字段插入: INSERT INTO <表名> (<字段1>, <字段2>, <字段3>) VA ...

  6. mysql批量用trim限定_mybatis中批量更新sql语句,trim、foreach标签,varchar定义理解

    准备工作 现在有一张表为:student,相关字段如下: mapper层方法 int batchUpdateStudent(List studentList); xml语句 update studen ...

  7. MySQL过滤相同binlog_通过Linux命令过滤出binlog中完整的SQL语句

    DB:MySQL 5.6.16 CentOS:CentOS release 6.3 (Final) 当insert语句通过空格跨行输入的时候,如何提取完整的insert语句! 创建一个空表: mysq ...

  8. thinkphp mysql 预处理_thinkPHP框架中执行原生SQL语句的方法

    本文实例讲述了thinkPHP框架中执行原生SQL语句的方法.分享给大家供大家参考,具体如下: 怎样在thinkphp里面执行原生的sql语句? $Model = new Model();//或者 $ ...

  9. 数据存取演变史、数据库软件应用史、数据库的本质、分类、 MySQL数据库、系统服务制作、基本的SQL语句

    数据存取演变史 1.文本文件 文本文件有两个主要的缺点:第一个就是不能保证多用户存取的文件路径一致:第二个就是不能保证多用户存取的数据格式一致 2.软件开发目录规范 软件开发目录规范规定了数据文件的大 ...

  10. mysql:通过JDBC接口执行创建触发器的SQL语句

    delimiter 以下是从mysql官方文档<23.3.1 Trigger Syntax and Examples>抄来的一段创建触发器的SQL脚本, delimiter // CREA ...

最新文章

  1. Debug常用指令和DOSBox使用步骤
  2. php的htaccess,PHP .htaccess文件详细介绍
  3. 做俯卧撑的10个技巧
  4. c++局部对象是什么_小白学Web前端难点是什么 JS进阶知识点有哪些
  5. Juddi介绍及安装
  6. 边工作边刷题:70天一遍leetcode: day 11-3
  7. java云端部署_Jelastic Java云端平台
  8. 漂亮、免费和响应式HTML5网站模板 - 转
  9. 主打轻薄长续航搭载骁龙730 联想Z6发布 1899元起!
  10. TensorBoard:嵌入可视化
  11. Android Handler机制分析
  12. 数据类型即其相互转换
  13. 盛情难却:北京,QECon来了
  14. 空间应用统计分析(回归分析)
  15. 详解DataStore,SharedPreferences终结者
  16. Silicon Labs CP210x USB to UART Bridge_6.6.6.14_4-8-2013_6.1_x64,驱动程序64位环境,ESP32
  17. OVER(PARTITION BY)函数介绍
  18. 【渝粤教育】电大中专常见病药物治疗 (2)_1作业 题库
  19. PyTorch DDP
  20. Databricks Secrets(机密)

热门文章

  1. shell字符串长度
  2. Android漫游记(1)---内存映射镜像(memory maps)
  3. Mysql原理、主从复制、半同步复制及基于SSL复制
  4. 简洁后台管理非常简洁
  5. F5 V9 利用SCCP实现带外管理及重装系统
  6. PowerShell 2.0远程管理之隐式远程管理
  7. 第五周课程总结试验报告三
  8. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)E
  9. 调参必备---GridSearch网格搜索
  10. Fatal error: Class 'ZipArchive' not found的解决办法