当前位置: 首页 > news >正文

.mysql secret在哪_MySQL如何使用索引

索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。如果一个表有1000行,这比顺序读取至少快100倍。注意如果你需要访问大部分行,顺序读取要快得多,因为此时我们避免磁盘搜索。

索引用于下面的操作:

·         快速找出匹配一个WHERE子句的行。

·         删除行。如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引。

·         当执行联接时,从其它表检索行。

·         对具体有索引的列key_col找出MAX()或MIN()值。由预处理器进行优化,检查是否对索引中在key_col之前发生所有关键字元素使用了WHERE key_part_# = constant。在这种情况下,MySQL为每个MIN()或MAX()表达式执行一次关键字查找,并用常数替换它。如果所有表达式替换为常量,查询立即返回。例如:

SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;

·         如果对一个可用关键字的最左面的前缀进行了排序或分组(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有关键字元素后面有DESC,关键字以倒序被读取。

·         在一些情况中,可以对一个查询进行优化以便不用查询数据行即可以检索值。如果查询只使用来自某个表的数字型并且构成某些关键字的最左面前缀的列,为了更快,可以从索引树检索出值。

SELECT key_part3 FROM tbl_name WHERE key_part1=1

假定你执行下面的SELECT语句:

SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

如果col1和col2上存在一个多列索引,可以直接取出相应行。如果col1和col2上存在单列索引,优化器试图通过决定哪个索引将找到更少的行来找出更具限制性的索引并且使用该索引取行。

如果表有一个多列索引,优化器可以使用最左面的索引前缀来找出行。例如,如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,col3)上的搜索进行了索引。

如果列不构成索引最左面的前缀,MySQL不能使用局部索引。假定有下面显示的SELECT语句。

SELECT * FROM tbl_name WHERE col1=val1;

SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

SELECT * FROM tbl_name WHERE col2=val2;

SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

如果 (col1,col2,col3)有一个索引,只有前2个查询使用索引。第3个和第4个查询确实包括索引的列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左边的前缀。 也可以在表达式通过=、>、>=、

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';

SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

在第1个语句中,只考虑带’Patrick’ <=key_col < ‘Patricl’的行。在第2个语句中,只考虑带’Pat’ <=key_col < ‘Pau’的行。

下面的SELECT语句不使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';

SELECT * FROM tbl_name WHERE key_col LIKE other_col;

在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。

如果使用… LIKE ‘%string%’并且string超过3个字符,MySQL使用Turbo Boyer-Moore算法初始化字符串的模式然后使用该模式来更快地进行搜索。

如果col_name被索引,使用col_name IS NULL的搜索将使用索引。

任何不跨越WHERE子句中的所有AND级的索引不用于优化查询。换句话说,为了能够使用索引,必须在每个AND组中使用索引前缀。

下面的WHERE子句使用索引:

... WHERE index_part1=1 AND index_part2=2 AND other_column=3

/* index = 1 OR index = 2 */

... WHERE index=1 OR A=10 AND index=2

/* optimized like "index_part1='hello'" */

... WHERE index_part1='hello' AND index_part3=5

/* Can use index on index1 but not on index2 or index3 */

... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

下面的WHERE子句不使用索引:

/* index_part1 is not used */

... WHERE index_part2=1 AND index_part3=2

/*  Index is not used in both parts of the WHERE clause  */

... WHERE index=1 OR A=10

/* No index spans all rows  */

... WHERE index_part1=1 OR index_part2=10

有时MySQL不使用索引,即使有可用的索引。一种情形是当优化器估计到使用索引将需要MySQL访问表中的大部分行时。(在这种情况下,表扫描可能会更快些,因为需要的搜索要少)。然而,如果此类查询使用LIMIT只搜索部分行,MySQL则使用索引,因为它可以更快地找到几行并在结果中返回。

Hash索引还有一些其它特征:

·         它们只用于使用=或<=>,IN操作符的等式比较(但很快)。它们不能用于比较 操作符,例如发现范围值的

·         优化器不能使用hash索引来加速ORDER BY操作。(该类索引不能用来按顺序搜索下一个条目)。

·         MySQL不能确定在两个值之间大约有多少行(这被范围优化器用来确定使用哪个索引)。如果你将一个MyISAM表改为hash-索引的MEMORY表,会影响一些查询。

·         只能使用整个关键字来搜索一行。(用B-树索引,任何关键字的最左面的前缀可用来找到行)。

相关文章:

  • json to mysql_JsonToMysql(JSON导入MySQL工具) V1.6 官方版
  • MySQL与CVM自建数据库优势_UCloud云数据库MySQL产品优势及与自建数据库对比
  • mysql中的like函数_mysql中regexp_like函数的用法
  • mysql 分表条件_MySQL优化(一):MySQL分库分表
  • mysql专业人数_mySQL算出一个或两个以上的人数?
  • pdo mysql防注入_pdo如何防止 sql注入
  • 脉冲超声波 发射脉宽_超声波液位计和雷达液位计到底有什么不同
  • python通过什么来判断当前程序是否在_python3怎么判断进程是否存在
  • php mysql搭建个人博客_Docker最全教程之使用PHP搭建个人博客站点(二十二)
  • arcgis gp 选择图层_ArcGIS Engine实现图层间空间选择的优化策略
  • mysql 8安装 windows xp_Windows XP下安装和配置Apache2.2.22服务器+PHP5+Mysql5
  • python怎么强制转换_Python如何实现强制数据类型转换
  • 正向生成数据库mysql_数据库表反向生成 Django ORM inspectdb
  • java 泛型定义_Java中泛型定义的含义
  • 字符串转数组java_java数组与字符串相互转换、整型与字符串相互转换【详解】...
  • 【React系列】如何构建React应用程序
  • 【RocksDB】TransactionDB源码分析
  • 【知识碎片】第三方登录弹窗效果
  • bearychat的java client
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Date型的使用
  • egg(89)--egg之redis的发布和订阅
  • JAVA SE 6 GC调优笔记
  • Linux快速复制或删除大量小文件
  • spark本地环境的搭建到运行第一个spark程序
  • spring + angular 实现导出excel
  • ucore操作系统实验笔记 - 重新理解中断
  • 构造函数(constructor)与原型链(prototype)关系
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端工程化(Gulp、Webpack)-webpack
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 区块链分支循环
  • 深度学习在携程攻略社区的应用
  • 什么是Javascript函数节流?
  • 微信小程序开发问题汇总
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #Linux(Source Insight安装及工程建立)
  • #Linux(权限管理)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (C#)获取字符编码的类
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)我也是一只IT小小鸟
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)利用webkit抓取动态网页和链接
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .bat批处理(六):替换字符串中匹配的子串
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET CLR基本术语
  • .NET Core Web APi类库如何内嵌运行?