作者:邵建永 索引基础 索引用途 索引有很多用途,并不仅仅是优化查询性能,这些用途包括: 保持数据完整性(主键和唯一索引) 优化数据检索性能(使用索引进行条件匹配和模式匹配) 改进表的连接操作(使用索引连接表...) 优化结果排序操作(ORDER BY) 优化聚合数据操作(GROUP BY) 创建索引 创建表时指定索引 主键索引: PRIMARY KEY index-name 非主键索引: UNIQUE KEY...查看索引 可以用SHOW INDEXES命令查看索引的信息,该命令输出包括索引的类型和当前报告的MySQL索引基数等信息。...我们应该养成习惯,让索引的类型与你打算进行比较操作的(值)类型保持匹配。 规则3:验证索引的有效性。...我们可以借助这条命令深入了解MySQL基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节(possible_keys,被评估的索引),以及当运行SQL语句时哪种策略会被优化器采用。
9) 有可能SQL判断走索引比全文扫描慢,就不会走索引。 10) is NULL或者is not NULL 有时候不走索引,都是MySQL底层会进行字段判断,看执行效率是否需要走索引还是走全文扫描。...[在这里插入图片描述](https://img-blog.csdnimg.cn/20200812212823581.png#pic_center) 单列索引与复合索引 尽量使用复合索引,少用单列索引。...按主键顺序插入 insert into t_user values(1,..),(2,..),... order by语句优化 查询的字段有创建索引,也就是覆盖索引时,order by会走索引排序,而非全文排序...,与该表关联的查询语句缓存会失效。...内存优化 MyISAM内存优化 my.cnf配置key_buffer_size = ...索引块缓冲区大小 innoDB内存缓存 innodb_buffer_pool_size=...
阅读内容关键字:索引底层结构与原理、索引失效分析、索引优化策略1、索引索引可以分为聚簇和非聚簇索引。1.1、聚簇索引一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。...Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。...tip:如果对记录的组成结构感兴趣可以看下 MySQL 的行格式。2、索引策略2.1、适合建立索引的 4 种情况频繁在 where 条件中出现的字段。...经常 group by 与 order by 的字段在生成索引树的过程中,数据会按照一定的顺序排列。...比如 (a,b,c) 组合索引,则匹配规则可以有以下情况:(a)、(a,b)、(a,b,c),当然由于优化器的原因,如果字段位置置换和原 SQL 是同样的意思,那么可以随意调换位置,优化器会进行重新排列
内容包括: 概念和基本使用 索引的优缺点及使用场景 索引底层结构(B,B+树及优缺点对比) 高效使用索引 聚簇索引与非聚簇索引 概念 索引存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。...单行查询时与B树相同 范围查询时,比如查找大于3小于8的数据,根据单行查找方式查找到3之后,通过链表直接遍历后面的元素。 B+树优势: B+树的磁盘读写代价更低/效率更高。...实现索引与实际数据分离。 如何高效率使用索引 独立列查询 SQL语句使用不当时,将无法使用现存索引而去全表扫描。所以需要注意:索引列不能是表达式的一部分,也不能是函数的参数。...(高性能提到5.0之后的版本会各自使用pdl和timestamp字段,然后SQL服务器对多个索引结果做相交(AND)或联合操作(OR)操作,通过extra可查询,但是我的5.7没有这种优化,不知道为什么...--------+----------------------------------------------------+ type字段含义 - all 全数据表扫描 == 这种情况下的是急需优化的
进入正题: 第二章、索引与优化 1、选择索引的数据类型 MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响。...在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。 1.1、选择标识符 选择合适的标识符是非常重要的。...Hash值不取决于列的数据类型,一个TINYINT列的索引与一个长字符串列的索引一样大。...相 对于MyISAM,二级索引与聚簇索引有很大的不同。...3.4、索引与加锁 索引对于InnoDB非 常重要,因为它可以让查询锁更少的元组。这点十分重要,因为MySQL 5.0中,InnoDB直到事务提交时才会解锁。
概念 1.普通索引:最基本的索引,它没有任何限制 2.唯一索引:索引列的值必须唯一,且不能为空,如果是组合索引,则列值的组合必须唯一。...优化 1、前导模糊查询不能使用索引, 如name like ‘%静’ 2、Union、in、or可以命中索引,建议使用in 3、负条件查询不能使用索引,可以优化为in查询, 其中负条件有!...同理,如果建立了(a,b,c)索引就不必再建立a,(a,b)索引 7、存在非等号和等号混合判断条件时,在建索引时,要把等号条件的列前置 8、范围列可以用到索引,但是范围列后面的列无法用到索引。 ...13、建立索引的列不能为null,使用not null约束及默认值 14、利用延迟关联或者子查询优化超多分页场景, MySQL并不是跳过offset行,而是取offset+N行,然后放弃前offset...优化的方法如下: 可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。 比如此列中,上一页最大的id是866612。
MySQL索引优化order by与group by 案例一 name符合最左前缀法则,但在age处断了,所以只能用到name列,索引长度202,order by也用到了index_union索引...案例八 遇到必须要用大于小于这种情况,可以使用索引覆盖来优化他,注意Extra中的信息,using where 对应的是where条件, using index对应的是name > 'AAA',因为select...的数据都在本索引树上,如果是*肯定不会有using index了,最后 就是order by的文件排序了。...using index效率高,using filesort效率低,using index利用了索引树本身的排序特性。...利用索引覆盖减少回表 group by本质就是先排序后分组,遵循最左前缀法则。如果分组不需要排序可以加上order by null禁止排序。
六、查看索引使用情况 七、使用索引的小技巧 公众号回复 1024 可获 4000G 架构师视频 一、索引的数据结构 B-Tree mysql主要使用 B-tree 平衡树 聚簇索引与非聚簇索引 聚簇索引...mysql 使用了 ICP(using index condition) 来进一步优化查询。...1、字符串字段权衡区分度与长度的技巧 截取不同长度,测试区分度 # 这里假设截取6个字符长度计算区别度,直到区别度达到0.1,就可以把这个字段的这个长度作为索引了mysql> select count...一次给你讲清楚 微服务架构:如何用十步解耦你的系统 学习MySQL高性能优化原理,这一篇就够了 推荐:堪称最详细的支付系统设计 动画+原理+代码+优化,解读十大经典排序算法 面试必备:缓存穿透,缓存雪崩的四种解决方案...掌握分布式场景下的秒杀架构与秒杀实践
索引优化 1. 尽量全值匹配 当建立索引后,能再where条件中使用索引列,就尽量使用。...尽量使用覆盖索引 覆盖索引(只访问索引的查询(索引列和查询列一致)),而尽量避免 select * 6. 不等于要慎用 在使用不等于(!...(解决方案同上,覆盖索引) 8. LIKE查询要当心 like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作。...EXPLAIN select name,age from staffs where name='July' or name = 'z3' 除了索引优化之外,还有一些查询优化的技巧: 1....LIMIT 1 当查询结果只可能为1条数据的时候,加上LIMIT 1可以增加性能,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
什么是索引(What is indexing)? 索引是对记录集的多个字段进行排序的方法。...这就是索引用来改进的地方。 假如索引记录只包含一个索引列以及一个指向原记录数据的指针,那么它显而易见会比原记录(多列)要小。所以索引本身所需要的磁盘块要更少,扫描数目也少。...(record pointer) Special 4 bytes 注意: MySQL里的指针按表大小的不同分别可能是 2, 3, 4 或 5 个字节。...鉴于创建索引需要额外的磁盘空间(上面的例子需要额外的277778个磁盘块),以及太多的索引会导致文件系统大小限制所产生的问题,所以对哪些字段建立索引,什么情况下使用索引,需要审慎考虑。...低基数的二分查找效率将降低为一个线性排序,而且查询优化器可能会在基数小于记录数某个比例时(如30%)的情况下将避免使用索引而直接查询原表,所以这种情况下的索引浪费了空间。
写在前面 在我们日常使用数据库的时候,肯定避免不了对数据库的优化。那么对数据库的优化又少了不索引的知识。 是的,建立索引能极大地提高查询的效率。...那么你知道吗,如果合理建立索引,可以更大地榨出数据库的性能——也就等同于进一步提高查询效率。 写下这篇文章就是为了记录一下对索引的优化,合理建立索引。...什么是索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 我们可以简单理解为:快速查找排好序的一种数据结构。...用户一般是在自己的后台查看订单,所以表中的其他用户数据与他无关,如果没有建立索引,每次查询都是全表扫描,则会很慢。...) where user_name = '我是用户名' and user_phone='110' 此种情况出现的概率比较小,毕竟mysql的解释器很复杂,也做了足够多的优化。
全文索引(LIKE优化) 优化的方式就是建立全文检索FULLTEXT 使用Mysql全文检索FULLTEXT的先决条件 MyISAM 引擎表和 InnoDB 引擎表(MySQL 5.6 及以上版本)都支持中文全文检索...order by满足两种情况会使用index排序: ①、order by语句使用索引最左前列, ②、使用where子句与order by子句条件列组合满足索引最左前列 双路排序:MySQL4.1之前,两次扫描磁盘...explain显示了MySQL如何使用索引来处理select语句以及连接表。 可以帮助选择更好的索引和写出更优化的查询语句。...fulltext 全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引 ref_or_null 与ref方法类似,只是增加了null值的比较...Not exists MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了。
优化和索引 提升SELECT 的最好方式是使用索引。索引条目作为表数据行的指针,使得查询能够很快的定位到所要查找的数据。所有的MySQL数据类型都可以创建索引。...索引只能创建在列全部的值上,而不能使用列部分值。 对于Innodb单表上的特定类型的全文索引,MySQL会有些优化以优化查询: FULLTEXT 查询只返回文档ID,或者文档ID和查询评级。...对于 = 比较符,无论表中有多少个NULL 值,为了优化,相关索引值集合大小为非NULL 值集合。然而,MySQL将不再收集和使用平均只集合大小。...无法使用HASH索引优化ORDER BY 操作。(这种类型的索引无法用于查询排序) MySQL无法通过此索引估计范围条件间的数据行(优化器对于范围查询的优化(选择索引))。...索引优化使用 MySQL支持生成列上的索引,如下: CREATE TABLE t1 (f1 INT, gc INT AS (f1 + 1) STORED, INDEX (gc)); 生成列gc 定义为
′; — 可以使用索引 7、is null, is not null 在无法使用索引,不过在mysql的高版本已经做了优化,允许使用索引 select id from t where num...10、利用索引下推减少回表的次数: 索引下推是Mysql5.6版本推出的功能,用于优化查询。...索引条件下推优化可以减少存储引擎查询基础表的次数,也可以减少MySQL服务器从存储引擎接收数据的次数。...并且应尽可能的让字段顺序与索引顺序相一致。...有一种与索引选择性有关的索引优化策略叫做前缀索引,就是用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引,同时因为索引key变短而减少了索引文件的大小和维护开销
MySQL的优化方案有哪一些?...本文记录MySQL优化方案 ,梗概如下: 优化SQL 优化索引 (一)优化SQL 1、通过MySQL自有的优化语句 优化SQL语句,通过脚本命令来了解执行率较低的语句,显示一下状态等。...在优化期间,MySQL会创建一个临时表,优化完成之后会删除原始表,然后会将临时表rename成为原始表。...MySQL会想Select * 那样进行全表扫描遍历。使用> <给定区间较好。 (二)优化索引 MySQL的索引是在存储引擎层面实现的,并不是在服务器层面实现的。...当通过某字段进行排序查询的时候,通过索引访问提高速度。 哪些情况下不适合使用索引? 表记录太少。 经常要进行增、删、修改的表。 经常与主字段一起捆绑查询,但是主字段索引值比较多的字段。
最近面试中总是会被问到mysql中的一些索引结构及一些sql优化的内容,这里针对自己看过的一些博客和关于mysql的书籍对mysql索引相关的内容进行一个总结。...该书签用来告诉InnoDB存储引擎哪里可以找到与索引相对应的行数据。由于InnoDB存储引擎表是索引组织表,因此InnoDB存储引擎的辅助索引的书签就是相应行数据的聚集索引键。...在涉及到有索引的查询时还需要考虑索引优化器的作用,查询优化器 一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。...证实它扫描了300010个索引节点和300010个聚簇索引的数据节点的方法见:https://mp.weixin.qq.com/s/Hb5bEi-TAfZD5goNsZT1eQ 优化 sql 语句优化:...mysql与mongodb MongoDB 是文档型的数据库,是一种 nosql,它使用类 Json 格式保存数据。
3.B+ 树的范围查询只需要遍历叶子节点的链表即可, B 树需要重复的中序遍历 4.B+ 树的叶子节点是链表结构,叶子结点本身依关键字的大小自小而大顺序链接 B+ 树允许元素重复 6.主键索引 与 辅助索引...值进行排序, 一个表可以有多个辅助索引,辅助索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同; 可以将创建联合索引,但是联合索引遵循最左匹配原则: ?...Using temporary: 使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和 分组查询 group by。 出现这个更要立刻优化sql。...当mysql分析全表扫描比使用索引快的时候不使用索引....; SQL 优化过程 开启慢查询并分析 explain + sql 慢查询 show profile 查询sql 在mysql 中的执行细节 数据库服务器参数调优 小表驱动大表 单路排序,从磁盘读取查询所需要的查询列
磁盘IO与预读 前面提到了访问磁盘,那么这里先简单介绍一下磁盘IO和预读,磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为寻道时间、旋转延迟、传输时间三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间...索引的两大类型hash与btree #我们可以在创建上述索引的时候,为其指定索引类型,分两类 hash类型的索引:查询单条快,范围查询慢 btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它...覆盖索引与索引合并 #覆盖索引: - 在索引文件中直接获取数据 http://blog.itpub.net/22664653/viewspace-774667/ #分析 select...=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式 #3.尽量选择区分度高的列作为索引,...所以优化语句基本上都是在优化rows。
from s1 where name='egon' and email='asdf'; #可以 select * from s1 where email='alex@oldboy.com'; #不可以 mysql...=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器 会帮你优化成索引可以识别的形式 #3.尽量选择区分度高的列作为索引,...所以语句应该写成create_time = unix_timestamp(’2014-05-29’); #5.需要在那些上面建立索引 解答: select user,host from mysql.user...索引一定要创建在 where 后的条件列上,而不是 select 后的选择数据的列上,另外,我们要尽量选择在唯一值多的大表上的列建立索引,例如:男女性别列唯一值, 不适合建立索引 慢查询优化 先运行看看是否真的很慢...这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高 explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询) order
领取专属 10元无门槛券
手把手带您无忧上云