| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 牛B程序员在“创建索引”时都会注意啥? -> 正文阅读 |
|
[大数据]牛B程序员在“创建索引”时都会注意啥? |
小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里
??今天想和大家聊一聊我们在创建索引时需要关注哪方面的问题,避免一手好牌打得稀烂。 专用车票一、明确索引的优缺点??知己知彼,百战不殆。想正确的使用索引,首先我们要知道索引的特性以及他的优缺点。 1-1、优点
1-2、缺点
??索引的目的是 ??其实索引的本质都是通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以高效锁定某数据的同时,还可以快速定位范围以及排序工作。 ??一般应用系统中的读写比例会在 ??说到索引,我们一定要了解他的数据结构以及他的存储和查询方式。拿MysQL来说,InnoDB、MyISAM、Memory每个存储引擎的都有所不同。
??对于MySQL最常用的InnoDB引擎,数据结构为B+Tree,选用 ??需要说明的是, 二、开发中创建索引时要注意哪些(经验之谈)咱们本文的示例我们构造一张简单的LOL英雄信息表,如下:
2-1、尽量构造覆盖索引??比如你创建了hero_name,price 的索引 idx_name_price(hero_name,price),查询数据时使用这种姿势:
??由于该索引中只存有hero_name、price和主键列,命中索引后, ??我们通过
??而如果只查select hero_name,price两列,或再加上主键id这列,都可以使用上覆盖索引不用再回表。即
2-2、创建复用性强的索引??还是这张t_lol表,如果增加一个高频接口,通过价格(price)查询英雄绰号(hero_title),那我们创建的
??key=NULL;Extra=Using where;显然是没有用上索引idx_name_price(hero_name,price),因为在MySQL中索引履行最左前缀原则。这个最左前缀可以是联合索引的最左X个字段,也可以是字符串索引的最左Y个字符。
??B+树的节点存储索引顺序是从左向右存储(说明一下,这个左到右只是说逻辑上的单向有序,并不是左边和右边。。别犟),在匹配的时候自然也要满足从左向右匹配; ??通常我们在建立联合索引的时候,也就是对多个字段建立索引,相信建立过索引的同学们会发现,无论是Oracle还是 MySQL 都会让我们选择索引的顺序,比如我们想在a,b,c三个字段上建立一个联合索引,我们可以选择自己想要的优先级,a、b、c,或者是b、a、c 或者是c、a、b等顺序。 为什么数据库会让我们选择字段的顺序呢?不都是三个字段的联合索引么?这里就引出了数据库索引的最左前缀原理。 ??在我们开发中经常会遇到明明这个字段建了联合索引,但是SQL查询该字段时却不会使用索引的问题。比如索引abc_index:(a,b,c)是a,b,c三个字段的联合索引,下列sql执行时都无法命中索引abc_index的;
以下三种情况却会走索引:
从上面两个例子大家是否阔以看出点眉目? ??是的,索引abc_index:(a,b,c),只会在(a)、(a,b)、(a,b,c) 三种类型的查询中使用。其实这里说的有一点歧义,其实(a,c)也会走,但是只走a字段索引,不会走c字段。 ??另外还有一个特殊情况说明下,下面这种类型的也只会有 a与b 走索引,c不会走。
??像上面这种类型的sql语句,在a、b走完索引后,c已经是无序了,所以c就没法走索引,优化器会认为还不如全表扫描c字段来的快。 ??最左前缀:顾名思义,就是最左优先,上例中我们创建了a_b_c多列索引,相当于创建了(a)单列索引,(a,b)组合索引以及(a,b,c)组合索引。 ??因此,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
??回到我们上面提到的问题,如果有一个高频接口:通过价格(price)查询英雄绰号(hero_title),那我岂不是还要新建一个单独的index(price)索引? ??其实这里引出了一个问题, ??因为可以支持最左前缀,所以当已经有了idx_name_price(hero_name,price)这个联合索引后,一般就不需要单独在hero_name上建立索引了。但单独查price时是无法使用该联合索引的,那么如果要使用该索引还能满足通过price列查询的需求。怎么办?正如你所想的, ??因此,第一原则是,如果通过调整顺序,可第以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。 ??所以你应该知道,这段开头的问题里,我们既要为高频请求创建(price,hero_name)这个联合索引,并用这个索引支持 2-3、索引不是越多越好??很显然,我们在文章前面提到的索引缺点处就做出了说明,索引是把双刃剑,提高查询效率的同时还需要使用数据库中大量资源去维护他。越来越大的索引文件、越来越慢的DML操作都是需要考虑的后果。 ??因此我们在创建索引时需要根据实际场景的需求,是读多写少还是读少写多?数据量创建索引的必要性?索引的硬伤?等。 ??有同学问我数据量少时(几十条?)创建索引和不创建索引 ??搞得我一时不知道怎么回答。。作为一名老程序员,建议大家把眼光放长远些,别在这种问题上花太多时间研究。只能说是,如果有业务会使用到,建议都按照我们开发时创建索引的规范来创建,后续总会用得上。数据少索引维护成本也可以忽略不计,别留坑就行。 2-4、使用索引的一些暖心建议1、索引不会包含有null值的列 ??只要列中包含有null值都将不会被包含在索引中,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时建议不要让字段的默认值为null。 2、使用短索引 3、索引列排序 4、like语句操作 5、不要在列上进行运算 ??这将导致索引失效而进行全表扫描,例如
6、不使用not in和<>这类非集操作 ??这不属于支持的范围查询条件,不会使用索引。 总结??在我们实际操作索引 ??快过年了,过年得有过年得态度,有啥事儿,明年再说吧~~ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 | -2024/9/8 9:00:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |