精华内容
下载资源
问答
  • 列优先原则
    2021-10-04 22:56:58

    最左优先原则:组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到。只要组合索引最左边第一个字段出现在Where中,那么不管后面的字段出现与否或者出现顺序如何,MySQL引擎都会自动调用索引来优化查询效率。

    根据最左匹配原则可以知道B-Tree建立索引的过程,比如假设有一个3列索引(col1,col2,col3),那么MySQL只会会建立三个索引(col1),(col1,col2),(col1,col2,col3)。

    则可知当查询语句中where后只要有col1就会用到索引。

    创建四种不同索引的方法

    更多相关内容
  • 行列优先原则在计算机领域的应用主要如下。行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序...
  • 原 矩阵基础 (1). 行优先和列优先的问题 2016年08月18日 18:37:00 林微 阅读数:7351 ...

    矩阵基础 (1). 行优先和列优先的问题

          版权声明:林微原创,未经允许不得转载。          https://blog.csdn.net/Canhui_WANG/article/details/52242496        </div>
            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
                              <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
          <div class="htmledit_views" id="content_views">
    

    摘要

    本文主要探讨的是“行优先”原则和“列优先”原则的问题。


    1. 背景

    首先了解“行优先”和“列优先”的知识,这两种方式在数学上的直观描述如下,给定如下矩阵:

    根据行优先的原则,其排序方式为


    根据列优先的原则,其排序方式为



    2. 计算机领域的应用

    行列优先原则在计算机领域的应用主要如下。行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序访问的内存地址之间连续性越差。所以,我们应该尽量在行优先机制的编译器,比如C/C++,CUDA等等上,采用行优先的数据存储方式;在列优先机制的编译器,比如Fortune, Matlab等等上,采用列优先的数据存储方式。但这种思想渗透到编程中之后,代码的质量就会提高一个档次。


    3. 以矩阵计算为例(Matlab编译器下测试)

    
     
    1. % data
    2. A = [ 1 1
    3. 2 2
    4. 3 3
    5. 4 4
    6. 5 5
    7. 6 6
    8. 7 7
    9. 8 8
    10. 9 9];
    11. B = [ 1 2 3 4 5 6 7 8 9
    12. 1 2 3 4 5 6 7 8 9];
    13. C = zeros(9,9);
    14. % The method of matrix multiplication in Matlab
    15. tic
    16. C = A*B;
    17. toc
    18. % Our impletation method of matrix multiplication
    19. tic
    20. for ra = 1:9 % raws of the matrix A
    21. for cb = 1:9 % columns of the matrix B
    22. for len = 1:2
    23. C(ra,cb) = A(ra,len)*B(len,cb)+C(ra,cb);
    24. end
    25. end
    26. end
    27. toc
    28. % Optimal method 1
    29. tic
    30. for cb = 1:9 % columns of the matrix B
    31. for ra = 1:9 % raws of the matrix A
    32. for len = 1:2
    33. C(ra,cb) = A(ra,len)*B(len,cb)+C(ra,cb);
    34. end
    35. end
    36. end
    37. toc
    38. % Advanced optimal method 2
    39. A = A'; % you can also directly given A = [ 1 2 3 4 5 6 7 8 9
    40. % 1 2 3 4 5 6 7 8 9];
    41. B = [ 1 2 3 4 5 6 7 8 9
    42. 1 2 3 4 5 6 7 8 9];
    43. tic
    44. for i = 1:9 % columns of the matrix A
    45. for j = 1:9 % columns of the matrix B
    46. for len = 1:2
    47. C(i,j) = A(len,i)*B(len,j)+C(i,j);
    48. end
    49. end
    50. end
    51. toc

    4. 测试和分析


    测试结果如上图所示,第一个时间为Matlab自带的乘法运算,第二个为我们原始实现的乘法计算,第三个为循环中行列变换(适应列优先编译器的处理)。

    最重要的是第四个是本人原创的矩阵乘法方法,简单地说就是将A矩阵转置,然后设计相应的算法实现矩阵乘运算。在这个点上,希望在理解原理的基础上能给读者一些启发。在本例中,这样做效率最高,原因其一是本例中原始数据结构上适合我这样处理;原因其二是这样做的目的是使得任何一个子乘法的处理上,两乘数所在的内存空间上都是连续,而不仅仅是一个连续(注意:这是本文的核心,读者理解透了一定会很有收获,认真看我给出的程序实现。这是核心,不懂的可以交流思想)!

    另外,本文中我给出的这个方法是矩阵乘法里面最优的方法,至少数学逻辑上是这样。之所以Matlab自带的乘法计算之所以性能还不错,是因为Matlab自带的运算都是经过优化的,包括硬件加速,系统加速等自己设计的应用很能调用加速方法。


    展开全文
  • 某些特殊矩阵可以压缩存储空间定义:若 n 阶方阵中任意一个元素 a[i][j]=a[j][i],则该矩阵称为对称矩阵普通存储:n*n 二维数组压缩存储策略:只存储主对角线 + 下三角区 以 该策略 为例,按行优先原则将各元素存入...

    数组的存储结构

    一维数组的存储结构

    image.png

    1. 各数组元素大小相同,且物理上连续存放。
    2. 数组元素 a[i] 的存放地址=LOC+i*sizeof(ElemType)
    3. 除非题目特别说明,否则数组下标默认从 0 开始

    二维数组的存储结构

    image.png

    M 行 N 列的二维数组 b[M][N] 中,若按照行优先存储,则 b[i][j] 的存储地址=LOC+(i*N+j)*sizeof(ElemType)

    普通矩阵的存储

    可用二维数组存储

    image.png

    注意:描述矩阵元素时,行、列号通常从 1 开始;而描述数组时通常下标从 0 开始(具体看题目给出的条件,注意审题!)

    特殊矩阵

    分类:

    1. 稀疏矩阵

    2. 方阵:

      1. 对称矩阵
      2. 三角矩阵
      3. 三对角矩阵

    某些特殊矩阵可以压缩存储空间

    对称矩阵

    定义:若 n 阶方阵中任意一个元素 a[i][j]=a[j][i],则该矩阵称为对称矩阵

    普通存储:n*n 二维数组

    压缩存储策略:只存储主对角线 [i=j]+ 下三角区 [i<j]

    image.png

    以 该策略 为例,按行优先原则将各元素存入一维数组中。

    image.png

    问题:

    1. 数组大小应该设为多少?
    2. 站在程序员的角度,对称矩阵压缩存储后怎样才能方便使用?

    解答:

    1. 数组大小应该设为多少?
    length:n,数组下标默认0开始:
    01个数据
    12个数据
    23个数据
    ....
    n-1:n个数据
    //以上规律不就是数学的等差数列的前n项和吗
    

    等差数列公式: ^7kygmb

    image.png

    1. 站在程序员的角度,对称矩阵压缩存储后怎样才能方便使用?

    可以实现一个“映射”函数:矩阵下标➡一维数组下标,看下列步骤

    1. 按行优先:按行[就是横着走]优先的原则,a[i][j] 是第几个元素?

      思路分析:首先 a[i][j] 是在第 i 行第 j 列,而 i 行前面有 i-1 行,i-1 行就有 (1+2+3+...+i−1) 个元素,而在元素所在行中元素前有 j 个元素,总的元素就是等于:如下图

      image.png

      image.png

      j-1 是为了下标从零开始计算

      a[i][j]==a[j][i]

    2. 按列优先:按列[就是竖着走]优先的原则,a[i][j] 是第几个元素?

      思路分析:首先 a[i][j]是在第i行第j列,而第j列前有第j-1列,第1列有n个元素,且往后排,列的元素个数依次递减,为(n+n-1+n-2+...+2+1)个,i行前面(垂直方向)有i-j个元素,总的元素就是:【与上面的[公式](3.12 矩阵的压缩存储) 进行联想】

      image.png

    三角矩阵

    1. 下三角矩阵:除了对角线和下三角区,其余的元素都相同
    2. 上三角矩阵:除了对角线和上三角区,其余的元素都相同

    image.png

    下三角矩阵

    image.png

    压缩存储策略(下三角矩阵):按行优先原则将橙色区元素存入一维数组中。并在最后一个位置存储常量c

    image.png

    上三角矩阵

    image.png

    压缩存储策略 (上三角矩阵):按行优先原则将绿色区元素存入一维数组中。并在最后一个位置存储常量 c

    image.png

    三对角矩阵的压缩存储

    image.png

    1. 三对角矩阵,又称带状矩阵

    2. 当|i-j|绝对值>1 时,有 a[i][j]=0(1<i,j≥n)

    3. 压缩存储策略:按行优先 (或列优先) 原则,只存储带状部分

    按行优先

    image.png

    存储空间大小计算:除开头行和末尾行,其余行均有三个元素,元素个数为: 3 n − 2 3n-2 3n2

    image.png

    根据下标求位置

    image.png

    image.png

    稀疏矩阵的压缩存储

    稀疏矩阵:非零元素远远少于矩阵元素的个数,,如下图

    image.png

    压缩存储策略:

    1. 顺序存储 – 三元组<行,列,值>

      image.png

    2. 链式存储 – 十字链表法

      image.png

    总结

    image.png

    常见考点

    image.png

    展开全文
  • 这道题目考察的知识点是MySQL组合索引(复合索引)的最左优先原则。 最左前缀匹配原则 在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,组合索引的第一个...

    MySQL数据库,game_order表表结构如下,下面哪些sql能使用到索引?

    这道题目考察的知识点是MySQL组合索引(复合索引)的最左优先原则。

    最左前缀匹配原则

    在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到,示例:
    对列col1、列col2和列col3建一个联合索引:

    KEY test_col1_col2_col3 on test(col1,col2,col3);

    联合索引 test_col1_col2_col3 实际建立了(col1)、(col1,col2)、(col,col2,col3)三个索引。

    上面这个查询语句执行时会依照最左前缀匹配原则,检索时会使用索引(col1,col2)进行数据匹配。

    注意

    索引的字段可以是任意顺序的,如:

    SELECT * FROM test WHERE col1=“1” AND clo2=“2”
    SELECT * FROM test WHERE col2=“2” AND clo1=“1”

    这两个查询语句都会用到索引(col1,col2),mysql创建联合索引的规则是首先会对联合合索引的最左边的,也就是第一个字段col1的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个字段col2进行排序。其实就相当于实现了类似 order by col1 col2这样一种排序规则。

    所以题目会创建三个索引(plat_order_id)、(plat_order_id与plat_game_id的组合索引)、(plat_order_id、plat_game_id与plat_id的组合索引)。根据最左匹配原则,where语句必须要有plat_order_id才能调用索引(如果没有plat_order_id字段那么一个索引也调用不到),如果同时出现plat_order_id与plat_game_id则会调用两者的组合索引,如果同时出现三者则调用三者的组合索引。

    思考

    对于联合索引(col1,col2,col3),查询语句SELECT * FROM test WHERE col2=2;是否能够触发索引?

    EXPLAIN SELECT * FROM test WHERE col2=2;
    EXPLAIN SELECT * FROM test WHERE col1=1;

    借助mysql查询优化器explain,explain会纠正sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划,观察explain中上述两个sql语句结果的type字段。查询中分别是:

    • type: index
    • type: ref

    index:这种类型表示mysql会对整个该索引进行扫描。要想用到这种类型的索引,对这个索引并无特别要求,只要是索引,或者某个联合索引的一部分,mysql都可能会采用index类型的方式扫描。但是呢,缺点是效率不高,mysql会从索引中的第一个数据一个个的查找到最后一个数据,直到找到符合判断条件的某个索引。所以,上述语句会触发索引。
    ref:这种类型表示mysql会根据特定的算法快速查找到某个符合条件的索引,而不是会对索引中每一个数据都进行一一的扫描判断,也就是所谓平常理解的使用索引查询会更快的取出数据。而要想实现这种查找,索引却是有要求的,要实现这种能快速查找的算法,索引就要满足特定的数据结构。简单说,也就是索引字段的数据必须是有序的,才能实现这种类型的查找,才能利用到索引。

    为什么要使用联合索引

    减少开销。建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销!

    覆盖索引。对联合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。

    效率高。索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W10%=100w条数据,然后再回表从100w条数据中找到符合col2=2 and col3= 3的数据,然后再排序,再分页;如果是联合索引,通过索引筛选出1000w10% 10% *10%=1w,效率提升可想而知!

    转载于:https://www.cnblogs.com/CKhomepage/p/10613618.html

    展开全文
  • 2.2.1.2 策略2 存储策略:只存储主对角线+下三角区的元素,并且按列优先原则将各元素存入一维数组中,因此需要存储(1+n)*n/2个元素。存储是为了使用,因此存储方式要使得访问矩阵中的某个元素时能很快找到它。可以...
  • 优先与列优先的循环方式来计算 这些单元格的总 和,看看性能的差距,我们直接贴出源码: package com.operation; import java.util.Date; import java.util.Random;  /** * 行优先与列优先的性能差距测试 * @...
  • 在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例: 对col1、col2和col3建一个联合索引 KEY test_col1_col2_col3 on test(col1,col2,col3); 联合...
  • MySQL最左匹配原则,道儿上兄弟都得知道的原则

    万次阅读 多人点赞 2020-09-11 19:31:00
    目录一、最左匹配原则的原理二、违背最左原则导致索引失效的情况三、查询优化器偷偷干了哪些事儿四、需要你mark的知识点1、如何通过有序索引排序,避免冗余执行order by2、like 语句的索引问题3、不要在上进行运算...
  • 深度优先搜索(DFS)与广度优先搜索(BFS)详解 1.广度优先搜索算法 1.1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次。 但是图的遍历相对树而言要更为...
  • 采用符号优先法,设立2个栈,一个数据栈,一个符号栈,另外还有出,符号优先表,采用直接读取数字的方式。
  • MySQL索引之最左匹配原则

    千次阅读 2022-05-09 19:13:08
    本文介绍MySQL最左匹配原则的详细工作机制。
  • 广度优先搜索(BFS)

    千次阅读 2021-04-11 09:13:09
    广度优先搜索(BFS) 一、定义  宽度优先搜索(Breadth first Search,BFS),简称宽搜,又称广度优先搜索。它是从初始结点开始,应用产生式规则和控制策略生成第一层结点,同时检查目标结点是否在这些生成的结点中。若...
  • 例题:最高响应比优先调度算法

    万次阅读 多人点赞 2020-11-05 18:43:38
    高响应比优先HRRN 高响应比优先调度算法主要用于作业调度,该算法是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑每个作业的等待时间和估计的运行时间。在每次进行作业调度时,先计算后备作业队列中每个作业...
  • 索引最左匹配原则

    千次阅读 2021-01-14 15:23:58
    写在前面:我在上大学的时候就听说过数据库的最左匹配原则,当时是通过各大博客论坛了解的,但是这些博客的局限性在于它们对最左匹配原则的描述就像一些数学定义一样,往往都是出123点,满足这123点就能匹配上索引...
  • Mysql最左匹配原则

    千次阅读 2022-01-15 23:06:56
    原文链接:Mysql最左匹配原则_Summer的博客-CSDN博客_最左匹配原则 ⛽️ 原文链接:Mysql最左匹配原则_Summer的博客-CSDN博客_最左匹配原则 索引的底层是一颗B+树,构建一颗B+树只能根据一个值来构建。...
  • 图论——深度优先搜索

    千次阅读 2021-04-17 18:07:11
    图论——深度优先搜索 什么是深度优先搜索: 深度优先搜素是对先序遍历的一种推广,和广度优先搜索不同,深度优先搜素的搜索顺序是先遍历当前节点,然后下次只先探索一个当前节点的临近节点,然后重复刚才的过程,...
  • MySQL 索引最左前缀原则

    千次阅读 2021-01-08 23:25:22
    MySQL 索引最左前缀原则 索引最佳左前缀法则:带头大哥不能死、中间兄弟不能断 1、准备数据 建表 CREATE TABLE IF NOT EXISTS staff ( id INT PRIMARY KEY auto_increment, name VARCHAR(50), age INT, pos ...
  • mysql数据库建立组合索引原则

    千次阅读 2021-01-28 05:11:47
    mysql建立多索引有最左前缀的原则,即最左优先,如:如果有一个2的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;如果有一个3索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,...
  • MySQL 最左匹配原则

    千次阅读 2021-06-06 10:56:18
    通常我们在建立联合索引的时候,...这里就引出了数据库索引的最重要的原则之一,最左匹配原则。 在我们开发中经常会遇到这种问题,明明这个字段建了联合索引,但是SQL查询该字段时却不会使用这个索引。难道这索引是假
  • 联合索引-最左匹配原则

    千次阅读 多人点赞 2022-03-28 13:50:27
    二、最左匹配原则: 最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。 1)全匹配时: 结论:修改查询顺序,发现结果一样。是以为MySQL会通过优化器...
  • MySQL 大表添加一的实现

    千次阅读 2021-03-04 05:27:30
    问题参考自: https://www.zhihu.com/question/440231149 ,mysql中...答案为个人原创以前老版本 MySQL 添加一的方式:ALTER TABLE 你的表 ADD COLUMN 新 char(128);会造成锁表,简易过程如下:新建一个和 Tabl...
  • 索引6:联合索引的最左匹配原则

    千次阅读 2020-02-13 18:17:48
    举例 索引A和B 建立联合索引 index(A,B)(A,B顺序有序) explain select X from XX where A=’‘and B=’’ 走 ab索引 explain select X from XX where A=’‘走 ab索引 explain select X from XX where B=’'不走...
  • 每日一面 - MySQL 大表添加一

    万次阅读 2021-01-20 09:24:20
    以前老版本 MySQL 添加一的方式: ALTER TABLE 你的表 ADD COLUMN 新 char(128); 会造成锁表,简易过程如下: 新建一个和 Table1 完全同构的 Table2 对表 Table1 加写锁 在表 Table2 上执行 ALTE.
  • MySQL最左匹配原则

    千次阅读 2021-02-06 00:59:04
    情况一:where a>1 and b=2,由于a>1的情况下,b是无序的,所以a能用到索引,b用不到 情况二:where a=1 and b=2,由于a=1的情况下,b是有序的,所以a,b都能用到索引 最左匹配原则:最左优先,遇到范围查询会停止...
  • 一、覆盖索引 1.1 概念 索引是高效找到行的一个方法,当能...使用explain,可以通过输出的extra来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询 1.3 注意 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,401
精华内容 23,360
热门标签
关键字:

列优先原则