Mysql索引的学习心得

  • 索引的分类
    根据创建分类
    1.主键索引(聚集索引 & 特殊索引)
    主键索引也称为聚簇索引,其实我们在创建表后(比如以自增id为主键)时,主键索引已经建立好了;一张表中只能有一个主键索引,通常我们选取的主键索引(比如id)都是自增的,它的记录顺序与磁盘中的物理地址顺序相同的
    2.二级索引(非聚集索引)
    我们平时为了优化查询速度所添加的索引都可以称为二级索引,二级索引都可以看成是建立索引字段的与主键相关联的联合索引
    根据使用分类
    1.覆盖索引
    覆盖索引简单来说,sql语句中的字段都被包含在索引中,可以理解为可以直接从索引上获取想要的数据,不需要回表进行查询,所表现出来的状态为用 EXPLAIN 解析出来的Extra 为 using index
    2.辅助索引
    与覆盖索引不同,所查询的数据并不是都能够在索引中找到,这个时候会进行回表查询,通常情况下如果回表率达到30%的情况下,Mysql可能会选择不适用索引,进行全表扫描,索引我们不会在比如性别上建立索引
    根据字段数量分类
    1.单索引
    唯一索引 – 几乎为唯一值的字段 90%以上是惟一的
    2.联合索引
    通常我们优化查询语句时应用最多的索引

  • EXPLAIN* 会对我们使用的sql语句进行解析,下面的内容就是根据解析出的结果,得出我们将要优化sql语句的方向
    type:告诉我们对标使用的访问方式,主要包含如下几种类型。

    ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)
    const、system、NULL指查询优化到常量级别, 甚至不需要查找时间.
    . all: 全表扫描,MySQL将遍历全表以找到匹配的行 ,逐行做全表扫描.,运气不好扫描到最后一行。
    . const: 读常量,最多只会有一条记录匹配,由于是常量,实际上只需要读一次。
    . eq_ref:最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问
    . fulltext:进行全文索引检索
    . index:全索引扫描
    . index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行和并,在读取表数据。
    . index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引。
    . rang:索引范围扫描,只检索给定范围的行,使用一个索引来选择行,能根据索引做范围的扫描。
    . ref:join语句中被驱动表索引引用的查询,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值,通过索引列,可以直接引用到某些数据行。
    . ref_or_null:与ref的唯一区别就是使用索引引用的查询之外再增加一个空值的查询。
    . system:系统表,表中只有一行数据:
    . unique_subqery:子查询中的返回结果字段组合式主键或唯一约束。
    Possible_keys:该查询可以利用的索引。如果没有任何索引可以使用,就会显示程null,这项内容对优化索引时的调整非常重要。
    key:优化器从possible_keys中选择使用的索引。
    key_len:被选中使用索引的索引建长度。
    ref:列出是通过常量,还是某个字段的某个字段来过滤的
    rows:优化其通过系统手机的统计信息估算出来的结果集记录条数
    extra:查询中每一步实现的额外细节信息。
    . using index : 出现这个说明mysql使用了覆盖索引,避免访问了表的数据行,效率不错。
    . using where :这说明服务器在存储引擎收到行后讲进行过滤。
    . using temporary :这意味着mysql对查询结果进行排序的时候使用了一张临时表
    . using filesort :这个说明mysql会对数据使用一个外部的索引排序
    注意当出现using temporary 和 using filesort时候说明需要优化操作

  • 索引是根据B+树的结构来设计的,可以想象成平衡二叉树,通常我们使用的索引有B-tree,hash,fulltext(全文)三种索引

B-tree:我们通常最常使用的索引,那么它的查询速度就取决于树的高度,所以数据量的增大会影响索引对性能的损耗。我们平时所说的二分查找法可以方便我们理解索引的构造结构。首先数据一定是先进行了排序,所以我们说最好使用自增的主键(减少性能损耗),用PHP的代码展示应该是这样的
`<?php
//二分查找法
function binSearch($arr, $search)

{

$height = count($arr)-1;$low = 0;

while ($low <= $height) {
    $mid = floor(($low + $height) / 2);//获取中间数        
    if ($arr[$mid] == $search) {
            return $mid;//返回       
    } elseif ($arr[$mid] < $search) {//当中间值小于所查值时,则$mid左边的值都小于$search,此时要将$mid赋值给$low
        $low = $mid + 1;          
    } elseif ($arr[$mid] > $search) {//中间值大于所查值,则$mid右边的所有值都大于$search,此时要将$mid赋值给$height
        $height = $mid-1;
    }
}
return "查找失败";

}`

hash:哈希索引值包含哈希值和行指针,而不存储字段值,所以不能使用索引的值避免数据库对于行的 读取(using index),这个值是无序且唯一的,所以在查找唯一数据的时候经常会用到,因为hash值不会跟随自增主键去自增,索引不适合用来范围查询

fulltext:全文索引只能应用于MYISAM的数据表,使用方式有点像正则表达式

where match(column1,column2) against('word1 word2 word3'),
	+word:一个前导的加号表示该单词必须 出现在返回的每一行的开头位置。

-word: 一个前导的减号表示该单词一定不能出现在任何返回的行中。

 (无操作符):在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() ... AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似。

 ( )括号用来将单词分成子表达式。括入括号的部分可以被嵌套。

~word:一个前导的代字号用作否定符, 用来否定单词对该行相关性的影响。 这对于标记“noise(无用信息)”的单词很有用。包含这类单词的行较其它行等级低。

 word* :搜索以word开头的单词,只允许出现在单词的末尾

"word1 word" :给定单词必须出现在数据记录中,先后顺序也必须匹配,区分字母大小写
  • 索引应该刨建在搜索、排序、归组等操作所涉及的数据列上,只在输出报告里出现的数据列不是好的候选。换句话说,那些在 WHERE子句、关联检索中的FROM子句、 ORDER BY或 GROUP BY子句中出现过的数据列最适合用来创建索引。只在 SELECT关键字后面的输出列清单里出现过的数据列并不是好的候选:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL宋红康学习日记是宋红康在学习MySQL数据库过程中记录的笔记和心得体会。在这个学习日记中,宋红康详细地记录了自己的学习过程以及遇到的问题和解决方法。 首先,宋红康在学习日记中介绍了MySQL数据库的基本概念和原理。他学习了MySQL的架构和组成部分,包括服务器端、客户端和存储引擎。他还学习了MySQL的常用数据类型和索引类型,了解了MySQL如何存储和管理数据。 其次,宋红康记录了自己学习MySQL的过程和方法。他通过阅读官方文档、参考书籍和观看教学视频等途径,系统地学习了MySQL的各种功能和语法。他还提到自己在学习过程中遇到的一些问题,如数据查询和更新的语法错误,以及性能优化的挑战等。他通过查找资料和请教他人的帮助,成功地解决了这些问题,并对解决方法进行总结和归纳。 此外,宋红康还分享了自己在使用MySQL时的一些经验和技巧。他介绍了一些常用的MySQL命令和操作,如创建数据库、建表、插入和查询数据等。他还分享了一些优化数据库性能的方法,如使用索引、合理设计数据结构和加强查询语句的效率等。这些经验和技巧对于其他学习MySQL的人来说是非常有价值的。 最后,在学习日记的结尾,宋红康总结了自己在学习MySQL过程中的收获和感受。他认为MySQL是一种功能强大、应用广泛的数据库系统,掌握MySQL的技能对于他的职业发展非常重要。在学习的过程中,他不仅加深了对数据库原理和操作的理解,还培养了自己分析和解决问题的能力。 总之,MySQL宋红康学习日记是宋红康在学习MySQL过程中的记录和总结,对于其他学习MySQL的人来说是一份宝贵的学习资料和参考指南。 ### 回答2: MySQL宋红康学习日记 今天我开始学习MySQL数据库,对于数据库的概念和作用有了初步了解。数据库是一个存储和管理数据的系统,可以方便地对数据进行增删改查操作。而MySQL是目前最流行的关系型数据库管理系统之一。 首先,我学习了MySQL的安装和配置。通过官方网站下载并安装了MySQL,然后进行了一些基本的配置,如设置用户名和密码等。安装完成后,我尝试连接并登录到MySQL服务器,成功进入了MySQL的命令行界面。 接下来,我学习了数据库的创建和管理。在MySQL中,可以使用CREATE DATABASE语句来创建一个新的数据库。我创建了一个名为“mydb”的数据库,并使用USE语句将其设为当前数据库。然后我学习了如何创建表格,表格是用来存储数据的基本单位,可以通过CREATE TABLE语句定义表格的结构和字段。 在创建表格后,我学习了如何向表格中插入数据。使用INSERT INTO语句可以将数据插入到表格中的指定字段中。我尝试了一些简单的插入操作,并成功地将一些测试数据插入到了表格中。 除了插入数据,我还学习了如何查询数据。可以使用SELECT语句从表格中提取数据。通过指定字段和条件,可以过滤和排序所查询的结果。我尝试了一些简单的查询操作,查找了符合条件的数据,并进行了一些排序操作。 在学习了基本的增删改查操作后,我对MySQL的学习有了初步的了解。下一步,我将继续学习MySQL的高级特性和优化技巧,以提高数据库的性能和效率。我相信通过不断的学习和实践,我能够更加熟练地使用MySQL,并能够应对更复杂的数据库操作。 ### 回答3: MySQL宋红康学习日记是宋红康学习MySQL数据库的记录和总结MySQL是一种开源的关系型数据库管理系统,被广泛应用于网站开发、数据分析和企业应用等领域。宋红康根据自己的学习经历和体会,记录了他在学习MySQL过程中的所思所感。 学习MySQL的第一天,宋红康首先了解了MySQL的基本概念和特点。MySQL是使用C和C++编写的,支持多用户多线程的数据库管理系统。它具有高性能、稳定可靠等特点,可以处理大量的数据和高并发的请求。宋红康对MySQL的这些特点表示非常欣赏,并意识到MySQL在现代互联网时代的重要性。 第二天,宋红康开始学习MySQL的基本操作。他学习了如何创建数据库、创建表和插入、更新、删除数据等基本操作。他通过实际操作,深入理解了SQL语句的执行过程和结果。 第三天,宋红康学习了数据库的设计和规范化。他了解了关系型数据库的基本原理和范式理论。他明白了数据库设计的重要性,以及遵循规范化原则对提高数据存储效率和数据一致性的重要性。 第四天,宋红康开始学习MySQL的高级应用。他学习了索引的创建、查询优化和事务处理等内容。他深入研究了索引的原理和使用方法,并学会了如何通过优化SQL语句提高查询性能。他还了解了事务的概念和特点,并通过实例演示了事务的使用方法。 第五天,宋红康开始进行MySQL的实战练习。他通过编写简单的应用程序,实现了与MySQL数据库的交互。他学会了使用编程语言与MySQL进行连接,并通过SQL语句实现数据库的增删改查操作。他深刻体会到了MySQL在实际应用中的价值和重要性。 总结起来,宋红康的MySQL学习日记记录了他在学习过程中的所学所悟。通过系统学习和实践,他对MySQL的基本概念、基本操作、数据库设计、高级应用和实际应用都有了较深入的了解。这些学习将为他今后的数据库工作奠定了坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值