前面几篇文章比较多地介绍了Hive的查询优化技巧,
今天抽一小篇幅介绍Mysql的查询优化技巧。
索引是Mysql查询优化的王牌!所以今天的内容是如何合理使用索引从而做到Mysql查询优化。
有小伙伴可能会问,现在都2021了,谁还用Mysql?其实不然,在很多初创互联网、或传统大企业的数分环境的确还是基于RDBMS的,所以掌握好Mysql很必要!!!
接下来直接进入正题。
一、什么是索引?
简单说 ,在关系数据库(RDBMS)中,索引是一种单独的、物理的对数据库表中一列或者多列值进行排序的一种存储结构。相当于图书的目录,可以根据目录中的页码快速找到需要的内容。
所以,当查询表有索引且我们的查询 SQL 有正确使用索引时,查询引擎可以根据索引进行快速查找,而不需进行全表扫描。
常规的我们把索引分为单列索引、组合索引:
如,某张表有以下字段:doctor_id、patient_id、hospital_id、pay_ment、date。
单列索引为一个索引只包含单个列,如:以 doctor_id 为索引;
组合索引即一个索引包含多个列,如:以 doctor_id、patient_id 两字段列组合作为索引。
二、如何使用索引?
查询语句要怎么写才能发挥索引的优化效果呢?
基础的,在我们的 where 子句中尽可能直接使用索引所谓切片限制条件!
另外的,一些坑我们要规避(这些坑会使索引无法真正发挥作用):
索引列使用 like 子句进行模糊匹配:like “%aaa%” 不会使用索引,只有like “aaa%”可使用索引
索引列上进行运算:select * from users where YEAR(adddate)<2007 不会使用索引,改成则能使用上索引 select * from users where adddate
当使用到组合索引时,以最左前缀的方式组合才可:如 doctorid、patient_id 两个字段的组合索引,where 条件限制 doctor_id或doctor_id+patient_id均可使用索引,但直接使用patient_id则无法使用索引。
只有以下逻辑判断符才使用索引:,>=,between,in,以及某些时候的 like,其他运算符会使索引无法真正发挥价值。
最后提醒一下,索引是有物理存储的,虽然它能大大提高查询速度,但同时也会降低更新表的速度。所以要合理地创建索引。当然这是DBA的工作了,我们作为分析师最终还是利用好索引的查询优化作用。
好看不忘点赞、收藏。欢迎评论区交流讨论!