「MySQL」高性能索引优化策略

【MySQL】:查询,索引及优化,高性能存储myCat 文章目录慢查询慢查询配置慢查询解读慢查询工具mysqldumpslowpt_query_digest索引聚簇索引跟非聚簇索引聚簇索引非聚簇索引:覆盖索引(Covering Index)总结:重点执行计划执行计划详解重点 MySQL优化参考 慢查询 慢查询:顾名思义,就是查询慢的日志,是指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句的日志。该日志能为SQL... 阅读详情

MySQL知识梳理图,一图看完整篇文章:

 

 

今天 讨论了索引的实现原理,了解了大概的原理,接下来了解一下高性能索引的优化策略,这也是面试中经常会问到的问题。

1. 工具 Explain

在详细总结MySQL的索引优化策略之前,先给大家介绍一个工具,方便在查慢查询的过程,排查大部分的问题:Explain。有关Explain的详细介绍,可以查看官网地址: dev.mysql.com/doc/refman/… 。这里再给大家推荐一个学习方法,就是一定要去官网学习第一手资料,如果觉得英语阅读有挑战的朋友,建议还是平时都积累看看英文文章,英语对于程序员来说很重要,先进的技术和理论很多资料都是英文版,而官网也是非常全的,要想成为技术大牛,这是必须需要修炼的。 扯淡就到这里,下面我简单描述一下Explain怎么使用。 举例:java学习交流qun:925895158

  mysql> explain select * from user where name="xiao" and age=9099 and birthday="1980-08-02";
     +----+-------------+-------+------------+------+---------------+------------+---------+-------------------+------+----------+-------+
     | id | select_type | table | partitions | type | possible_keys | key        | key_len | ref               | rows | filtered | Extra |
     +----+-------------+-------+------------+------+---------------+------------+---------+-------------------+------+----------+-------+
     |  1 | SIMPLE      | user  | NULL       | ref  | unique_key    | unique_key | 249     | const,const,const |    1 |   100.00 | NULL  |
     +----+-------------+-------+------------+------+---------------+------------+---------+-------------------+------+----------+-------+
复制代码

Explain 结果有好几列,简单说一下常用的列:select_type, type, key, key_len, ref, rows。其余列可以参考官网介绍。

  • select_type,是说查询的类型,是简单的查询还是复杂的查询,如果不是涉及子查询和UNION,select_type就是SIMPLE。其余的复杂查询还有SUBQUERY和UNION等。
  • type, 非常重要,经常查询分析时用到,type有几个值ALL、index、range、ref、const(system)、NULL。ALL代表全表扫描,从头扫到尾;index跟全表扫描一样,只不过MySQL扫描表的时候是按照索引次序进行而不是行;range,范围扫描,即有限制的索引扫描,开始于索引的某一点,返回匹配这个值域的行。ref,索引访问,返回所有匹配某个单个值得行。const,常量,查询的某部分优化转换成一个常量。NULL,一般就是说执行的时候用不着再访问表或者索引。查询速度类型排序:const > ref > range > index=ALL。
  • key,这个好理解,用到了哪个索引。
  • key_len。索引里使用的字节数。
  • ref,表示key列记录的索引中查找所用的列或者常量。

2. 准备Table

CREATE TABLE `user` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `gender` varchar(16) DEFAULT NULL,
 `name` varchar(64) DEFAULT NULL,
 `birthday` varchar(16) NOT NULL,
 `age` int(11) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `unique_key` (`name`,`age`,`birthday`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码

往表里插入了一些数据,方便下面问题的分析

3. B-Tree索引场景和相关限制:

B-Tree索引,按上一篇原理分析知道是按顺序存储数据的,所以并不是只要查询语句中用了索引就能起作用的,下面来看看具体的场景和限制

  1. 全值匹配。 全值匹配指的是和索引中的所有列进行匹配,例如:
mysql> explain select * from user where name="xiao" and age=9099 and birthday="1980-08-02";
+----+-------------+-------+------------+------+---------------+------------+---------+-------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key        | key_len | ref               | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------------+---------+-------------------+------+----------+-------+
|  1 | SIMPLE      | user  | NULL       | ref  | unique_key    | unique_key | 249     | const,const,const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------------+---------+-------------------+------+----------+-------+
复制代码

全值匹配,即按照索引的所有列均精确匹配,从ref和key_len看出,从语句用到了三个索引。理论上索引对顺序是比较敏感的,但实际上执行下面语句可以看看结果:

explain select * from user where age=9099 and birthday="1980-08-02" and name="xiao";
复制代码

结果答案是一样的,因为MySQL查询优化器会自动调整where子句的条件顺序,从而匹配最适合的索引。

  1. 匹配最左前缀 。如果想查找name=xiao的所有人,即只使用索引的第一列。
mysql> explain select * from user where name="xiao";
+----+-------------+-------+------------+------+---------------+------------+---------+-------+-------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key        | key_len | ref   | rows  | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+-------+----------+-------+
|  1 | SIMPLE      | user  | NULL       | ref  | unique_key    | unique_key | 195     | const | 15170 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+-------+----------+-------+
复制代码

可以看到用到了name这个索引。如果没有匹配最左前缀,结果是怎么样了:

mysql> explain select * from user where birthday="1980-08-02";
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+-------------+
|  1 | SIMPLE      | user  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 30340 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+-------------+
复制代码

可以看到如果没有用name查询索引,则变成了全表查询。

  1. 匹配列前缀。也就是说可以只匹配某一列的值的开头部分,例如想匹配name=xiao-1开头的数据
   mysql> explain select * from user where name like "xiao-1%";
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | user  | NULL       | range | unique_key    | unique_key | 195     | NULL | 1111 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
复制代码

可以看到类型是range, 使用key=unique_key的联合索引。 如果是name like "%xiao-1%" 则就不能使用索引了,其中原因可以根据B-Tree的特性想一下。

  1. 匹配范围值 。例如,想查找查找name在[xiao-1, xiao-200]之间的数据。
mysql> explain select * from user where name >  "xiao-1" and name <= "xiao-200";
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | user  | NULL       | range | unique_key    | unique_key | 195     | NULL | 1113 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
复制代码

可以看出type=range,用到了unique_key索引。

  1. 精确匹配某一列并范围匹配另外一列。比如想查 name="xiao", age在[1,100]之间的数据。
mysql> explain select * from user where name="xiao" and age > 1 and age < 100;
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | user  | NULL       | range | unique_key    | unique_key | 199     | NULL |   98 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
复制代码

可以从key_len的长度参考上一条范围匹配,发现key_len的长度变长了,实际就是用到了name和age2个索引,name是精准匹配,age是范围匹配。 思考: 如果sql语句变成:

select * from user where name="xiao" and age > 1 and age < 100 and birthday="2000-08-02";
复制代码

birthday的索引会用到吗?

刚才上面也提到了B-Tree索引有一些限制,现在总结一下:

  • 最左前缀原理,如果不是按照索引的最左列开始查找,则无法使用索引。
  • 不能跳过索引中的列,比如索引是(name, age, birthday),那么如果只提供name, birthday两列,则birthday的索引是无法使用的。
  • 如果查询中的某个列范围查询,则其右边所有列都无法使用索引。从第5点最后的思考题就是说的这一点限制。
  • 如果查询语句有函数或者表达式,都是没法使用索引的,比如age-1=18,或者left(name, 3) = xia 。
  • 匹配列前缀,也就是上面提到的第三点,如果like表达式是“%xiao-1%”,则也是没法使用索引的。

4. 索引策略

先总结一下索引的优点:

  • 索引大大减少了服务器需要扫描的数据量
  • 索引可以帮助服务器避免排序和临时表
  • 索引可以将随机I/O变成顺序I/O

说了三大优点,是不是觉得只要是个表,是个列就全部加上索引就好了?

这样显示是不对的,虽然索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,另外,MySQL在运行时也要消耗资源维护索引,因此索引并不是越多越好。 只要当索引帮助存储引擎快速查找到记录带来的好处大于其带来的额外工作时,索引才是比较有效的。

那是否有什么办法知道什么时候该用索引,什么时候不该用了?

  • 表记录比较少,简单的全表扫描更高效。少的界定的话一般也是靠经验,没有明确多少行算少,个人觉得2000行以内就ok的,实际业务中很多配置表,明显觉得不会有2000行的都可以。

  • 索引选择性。高性能MySQL(第三版)对索引选择性的定义是:不重复的索引值(也称为基数,cardinality)和数据表的记录总数(#T)的比值,范围从1/#T到1之间。索引选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。唯一索引的选择性是1,下面举例看一下如何计算选择性:

    mysql> select count( distinct name) / count(1) from user;
    +----------------------------------+
    | count( distinct name) / count(1) |
    +----------------------------------+
    |                           0.6632 |
    +----------------------------------+
    
    mysql> select count( distinct birthday) / count(1) from user;
    +--------------------------------------+
    | count( distinct birthday) / count(1) |
    +--------------------------------------+
    |                               0.0002 |
    +--------------------------------------+
    
    mysql> select count( distinct id) / count(1) from user;
    +--------------------------------+
    | count( distinct id) / count(1) |
    +--------------------------------+
    |                         1.0000 |
    +--------------------------------+
    复制代码

    上面可以看出,user表里,name索引的选择性还蛮高,id自增主键选择性就是1,birthday的选择性很低,其实没有必要做索引了。说白了就是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度非常低)。

    接下来总结一下常见的索引策略:

    • 独立的列: 独立的列是指索引的列不能使表达式的一部分,也不能是函数的参数。这个上面也有提到到,就不再重复。
    • 前缀索引: 有时候需要索引很长的字符列,比如name,名字这种字符一般比较长,如果作为索引,会将整个索引文件变得很大,也会导致查询速度慢下来。一种方法只索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。当然,这种优化也会降低索引的选择性,举例如下:
    mysql> select count( distinct left(name, 8)) / count(1) from user;
    +-------------------------------------------+
    | count( distinct left(name, 8)) / count(1) |
    +-------------------------------------------+
    |                                    0.3648 |
    +-------------------------------------------+
    
    mysql> select count( distinct left(name, 9)) / count(1) from user;
    +-------------------------------------------+
    | count( distinct left(name, 9)) / count(1) |
    +-------------------------------------------+
    |                                    0.6630 |
    +-------------------------------------------+
    复制代码

    可以看到当采用name,前缀8个字符时,选择性还比较低,当变成9个字符时,选择性就高了很多,修改索引为left(name, 9),看一下索引的长度降低了多少了。 将索引改为(name(9), age, birthday)

    mysql> explain select * from user where name="xiao" and age=9099 and birthday="1980-08-02";
    +----+-------------+-------+------------+------+---------------+-------------+---------+-------------------+------+----------+-------------+
    | id | select_type | table | partitions | type | possible_keys | key         | key_len | ref               | rows | filtered | Extra       |
    +----+-------------+-------+------------+------+---------------+-------------+---------+-------------------+------+----------+-------------+
    |  1 | SIMPLE      | user  | NULL       | ref  | unique_key2   | unique_key2 | 84      | const,const,const |    1 |   100.00 | Using where |
    +----+-------------+-------+------------+------+---------------+-------------+---------+-------------------+------+----------+-------------+
    复制代码

    可以对比全值匹配中的explain语句,key_len从249缩小到了84,缩小了三倍,大大减少了索引文件的大小,提高了效率。但是也有缺点,前缀索引对ORDER BY or GROUP BY操作无效。

  • 选择合适的索引列顺序,从场景分析中看,对于B-Tree索引是按顺序存储数据,所以选择一个最合适的顺序索引列对查询非常有帮助,但这个也没有比较直观的方法,一般考虑选择性和业务需求的特性。比如上面的例子,name的选择性>age>birthday,且通常业务中按某个用户的name查询的场景会居多,所以索引的顺序就是(name, age, birthday)。说白了就是较频繁作为查询条件的字段才去创建索引。

  • 聚簇索引的特性, 从上一篇索引的原理分析,InnoDB引擎使用的B-Tree索引就是聚簇索引,这类索引有什么特性了,上一篇也提到过,InnoDB数据是按主键聚集,如果表没有显示定义主键,则InnoDB会优先选择一个唯一的非空索引代替,如果找不到这样的索引,会隐式定义一个主键来聚簇索引。 所以在选择主键的时候,建议参考以下:

    • 占的字符尽量的小
    • 使用自增ID作为主键
    • 更新频繁的列最好不要作为索引

    有些人觉得使用业务中的唯一字段作为主键即可,没必要选一个跟业务无关的自增id作为主键,但我个人建议最好使用跟业务无关的自增ID作为主键。原因如下:

    • InnoDB数据按主键顺序聚集存储,数据记录本身被存于主索引的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)。 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。 如果用业务的唯一主键,可能非自增主键(如身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。可见插入的消耗是巨大的。

    • 为什么主键的字符要小了,因为二级索引是根据主键来检索数据,则叶子节点存储了主键列,也就是说二级索引的访问需要访问二次主键索引,如果主键索引很大,二级索引的可能比想象的要大很多,从而影响性能。

    • 更新频繁的列最好不要作为索引,如果更新频繁的列作为索引,每次更新,为了保持有顺,需要调整整个索引B-Tree树,这样的消耗也是挺大的。

  • 冗余和重复索引 MySQL允许相同列上创建多个索引,有时候看到建了一个UNIQUE KEY (name, age),然后还建了个 KEY (name),这样name这个索引就重复了,发现则需要删除单独的索引,可以减少很多开销。索引越多,会导致插入数据变慢。

  • 未使用的索引 在设计表的时候,刚开始需求可能需要用到某个字段的去查询,就将此字段增加了索引,可能最后需求变更的时候,这个字段基本很少有场景去查,这时候经常会忘记去删除此索引,导致没必要的开销。所以没必要的索引,最好是删除。

5. 大表如何删除无用数据:

如果一张表百万级以上,索引是需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增删改,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增删改的执行效率。且删除数据的速度跟创建的索引的数量是成正比的。有一个小技巧,可以参考:

  • 先删除索引,如果直接删除数据,会带来索引树的数据大规模的调整,消耗无法预估。
  • 然后删除无用数据,这时候没有索引,删除无用数据的速度将会快很多。
  • 删除数据后再重建索引,这时候数据也少了一些,速度也会相对快一点。

上面三个步骤比直接删除肯定是要快一点,如果直接删除数据的过程中删除失败,导致事务回滚,那消耗就成倍增加了。

需要MySQL相关资料的可以私信小编哦


 

SQL优化30条军规.pdf SQL优化的30条军规,希望可以帮到大家。军规适用场景:并发量大、数据量大的互联网业务,解读:讲解原因,解读比军规更重要 立即下载

相关推荐

翻倍密码系统主图指标-行情买卖以及持股-翻倍密码买点-获利了结,通达信炒股软件指标公式

华森制药,上图案例走势,低位出现“开始潜伏”信号,进场红色K线持股待涨,进入“翻倍密码买点”,开启紫色K线的持续上涨,目前也达到了翻倍行情,还没出现“获利了结”的出场信号。这套操盘系统,即便出现信号没走出翻倍行情,也都是可以全身而退,获利出局,或者微微止损出场,并不代表每一个波段都能翻倍,但是走翻倍行情,你按照信号参与或持仓是不会错过的。用这个操盘系统操作,你也不需要天天的盘中看盘,不需要担心盘中的震荡,只要趋势不变,哪怕是偶尔出现跌停,也不影响行情的继续上涨,这都是上涨途中的正常调整。

weixin_69760830的博客 3682

MySQL数据库开发的三十六条军规

MySQL数据库开发的三十六条军规,各种各样的mysql操作出现的问题都可以参考解决

weixin_51438987的博客 863

R语言 下载包出错Warning: 无法在貯藏處https://cloud.r-project.org/src/contrib中读写索引:

报错原因,竟然是ie浏览器的问题,unbelievable 1、在R中,下载包的时候,却发现报错:Warning: 无法在貯藏處https://cloud.r-project.org/src/contrib中读写索引: 无法打开URL'https://cloud.r-project.o 2、后来针对CRAN重新选择,但以下这几个都选择了一遍。都还是报错。 3、最后找到原因了。下载包是依赖本机的ie浏览器下载的。本身电脑 的ie浏览器出错了,打开是网页显示 打不开的。所以导致下...

2万+

阿里技术官首发珍藏版“Mysql性能优化宝典”再迎巅峰

MySQL之所以能成为现在最流行的开源数据库,这跟它的开放性、包容性是分不开的! 我先说一个笑话。这个笑话是我从万维钢的专栏里看到的。 三个逻辑学家走进酒吧,酒保问他们,三位都喝啤酒吗? 第一个逻辑学家说,我不知道。 第二个逻辑学家说,我不知道。 第三个逻辑学家说,是的。 这个笑话有点冷,需要用一点逻辑才能欣赏。要想否定“三人都喝啤酒”,只要有一个人知道自己不喝就行了。前两个逻辑学家说不知道,就说明他们自己是想喝的,只是不知道别人喝不喝。而第三个人一看前两个人都说不知道,那就说明这两个人肯定都是

bieber007的博客 1769

别再乱删文件了!修复Print Spooler服务自动停止的3个关键检查点(附Win10/Win11实测)

本文深入解析Windows系统中Print Spooler服务自动停止的常见原因及修复方法。从第三方驱动冲突、权限与服务依赖关系到打印队列积压,提供3个关键检查点的详细排查步骤,帮助用户彻底解决打印服务异常问题,适用于Win10/Win11系统。

weixin_31569671的博客 682

AI Agent ReAct架构设计模型剖析

ReAct通过"思考-行动-观察"循环运作:智能体先进行自然语言推理,再调用外部工具执行行动,观察结果后继续推理直至解决问题。这种架构提高了透明度和准确性,减少幻觉风险,使LLM能主动分解任务并利用外部数据源。实现关键在于精心设计的提示模板,引导LLM按结构化格式响应,而非依赖模型固有能力。

weixin_43939320的博客 1251

阿里架构师MySQL调优与架构设计思路:全在这一份PDF里了

前言: MySQL最为流行的开源数据库软件之一,但是为了照顾对MySQL还不熟悉的读者, 给大家带来的是阿里架构师MySQL性能调优与架构设计思路 希望能让更多的伙伴快速的掌握MySQL性能调优与架构设计 本次将在这几个方面去深入学习MySQL数据库 一基础篇 第1章MySQL基本介绍 第2章MySQL架构组成 第3章MySQL存储引|擎简介 第4章MySQL安全管理 第5章MySQL备份与恢复 二性能优化篇 第6章影响MySQL Serve

javassb的博客 343

Java 处理地理信息数据[DEM TIF文件数据获取高程]

EPSG 是一个国际标准,用于唯一标识地理坐标系和投影坐标系。

两点 1282

mysql 技术内幕 pdf_炸了!炸了!阿里巴巴顶级MySQL调优手册到手,这波加薪妥了...

实际工作中,有时候打开一个页面响应时间非常慢,这背后通常牵涉到SQL语句查询慢的问题。前面我们提到很多数据库结构设计,建索引等来视图提高MySQL的性能。但是如果我们实际业务场景中,SQL查询语句写的不合适,索引建的再好可能也达不到预期的高性能。因此,我们很有必要对查询进行分析,我写的查询为什么慢,该怎么样对查询进行优化。关于MySQL相关的内容,Alibaba肯定还是很有话语权的,尤其是关于My...

weixin_39657825的博客 362

S32K144 ADC硬件触发实战:PDB模块配置与DMA传输全流程解析

本文详细解析了S32K144微控制器中ADC硬件触发的全流程实现。通过配置PDB模块产生精确的定时触发信号,并联动DMA实现转换数据的自动搬运,构建了一个无需CPU干预的高效、低抖动数据采集系统。文章深入讲解了时钟配置、模块初始化、DMA引擎搭建及实战调试技巧,为汽车电子和工业控制应用提供了可靠的解决方案。

weixin_29174141的博客 227

【项目解析】2KW 230V 数字逆变器控制系统(二)

【项目解析】 2KW 230V 数字逆变器控制系统(一) 项目的 交流输出电压 并不是单纯一个电压环就能控制好的,而是典型的 双环控制架构:最终占空比控制量会经过计算: 然后写入 单片机 TMM 定时器的比较寄存器 (TMGRA0/TMGRD0/TMGRC1), → 定时器输出互补 PWM, → 驱动 IGBT 全桥, → 经过 LC 滤波形成 230 VAC / 50Hz 的正弦电压。总结交流电压是双环控制的结果:目标/作用:把输出 RMS 电压稳到目标(例如 230 VAC);在母线波动与负载变化下

Naiva的博客 1299

【MySQL】阿里巴巴规约

MySQL阿里巴巴规约1.MySQL阿里巴巴规约【转载】 1.MySQL阿里巴巴规约【转载】

Blue_Pepsi_Cola的博客 3388

Android 64位支持的坑:诡异的文件名问题

最近在尝试发布我的Android应用程序的更新时,遇到了一个令人困惑的64位错误。本文将详细讲解这个问题的产生原因及解决方法,供大家参考。

m0_74337424的博客 126

explain all 怎么优化_「MySQL」高性能索引优化策略

今天接上一篇『MySQL』揭开索引神秘面纱 讨论了索引的实现原理,了解了大概的原理,接下来了解一下高性能索引的优化策略,这也是面试中经常会问到的问题。1. 工具 Explain在详细总结MySQL的索引优化策略之前,先给大家介绍一个工具,方便在查慢查询的过程,排查大部分的问题:Explain。有关Explain的详细介绍,可以查看官网地址:https://dev.mysql.com/doc/ref...

weixin_39907311的博客 194

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL性能调优(十):MySQL性能优化(查询优化器、高性能的索引使用策略)

这一点,也是针对联合索引来说的,前面我们反复强调过,所有记录都是按照索引列的值从小到大的顺序排好序的,而联合索引则是按创建索引时的顺序进行分组排序。由于B+树中的数据页和记录是先按insert_time列排序的,所以我们上边的查询过程其实是这样的:找到insert_time值为’2021-03-22 18:23:42’ 的记录。找到insert_timee值为’2021-03-22 18:35:00’的记录。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 3万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《高性能MYSQL》--高性能的索引策略,总结索引类型

在多列上独立地创建多个单列索引,这种做法不太好,触发你许多查询都是基于单个列进行的,否则在创建了多列索引的情况下进行以多个列作为条件的查询时,mysql会进行索引合并,查询能够同时使用两个单列索引进行扫 描,并将结果进行合并。有一种特殊情况,如果前面的列为常量的时候,ORDER BY子句中的列也可以不满足索引 的最左前缀的要求。在列储存的值长度过长,可以选择固定长度的前缀来作为前缀索引,这样能提高系统的性能,需要注意的是前缀索引的选择性要与原来的大致相等。7. 二级索引访问需要两次索引查找,而不是一次。

Dennis_nafla的博客 1183

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MySQL性能调优(五):MySQL中的索引(B+树索引、哈希索引、全文索引、索引使用、高性能索引创建策略)

能表示的整数范围当然也是依次递增,如果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,比如我们能使用INT就不要使用BIGINT,能使用NEDIUMINT就不要使用INT,这是因为数据类型越小,在查询时进行的比较操作越快(CPU层次)数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘/0带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 4万+

MySQL 深入浅出系列04—高性能的索引策略

高性能索引策略

m0_45322619的博客 1792

MySQL 高性能索引使用策略

索引调优

学习学习学习学习 1331

MySQL高性能索引优化策略分析

胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电子工业出版技术成长领路人称号,荣获2024年电子工业出版社博文视点20周年荣誉专家称号。

huxian1234的专栏 866

MySQL中高性能索引的策略

mysql index

Senkorl blog 938

还有这些MySQL高性能索引优化策略等你试用

关于MySQL的优化,相信很多人都听过这一条:避免使用select*来查找字段,而是要在select后面写上具体的字段。 这么做的原因相信大家都应该知道:减少数据量的传输。 但我要讲的是另外一个原因:使用select*,就基本不可能再使用到覆盖索引(什么是覆盖索引,后面会讲),反而是将一个本该可以用覆盖索引的查询变成了不能使用覆盖索引的查询,就会导致随机I/O或回表查询(回表查询在下文介绍聚簇索引...

Dinosaur_1117的博客 364

MySQL索引使用策略和优化

在前面的文章里,我们介绍了MySQL索引的原理。那么在实际开发中,应该如何去使用索引以及如何去优化呢? 什么时候不应该使用索引? 索引并不都是有效的。有些场合,可能我们并不需要使用索引,甚至使用了索引反而会影响性能。 查询很少用到的列 如果某些列在查询时很少用到,那加不加索引的速度其实是差不多的。而增加索引会增加系统维护索引的开销,所以不值得创建索引。 表的数据量很少 如果在测试数据库里只...

程铭程铭你快成名的博客 4111

MySQL优化五-高性能的8个索引策略

正确创建和使用索引策略是实现高性能查询的基础,本文总结8个索引策略。

qiuweifan的博客 1367

MySQL高性能索引策略

高性能索引策略 正确地创建和使用索引是实现高性能查询的基础。高效地选择和使用索引有很多种方式,其中有些是针对特殊案例的优化方法,有些则是针对特定行为的优化。 独立的列 我们通常会看到一些查询不当地使用索引,或者使得 MySQL 无法使用已有的索引。如果查询的列不是独立的,则 MySQL 就不会使用索引。独立的列是指索引列不能是表达式的一部分,也不能是函数的参数。 例如,下面查询无法使用索引 select actor_id from where sakila.actor where actor_id + 1

浪人与酒 735
上一篇: [手把手教程][JavaWeb]SSM框架验证、修复和实例
下一篇: 在Ubuntu上使用MySQL设置远程数据库优化站点性能
Java架构技术官
博客等级 码龄6年 9粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值