mysql 索引计划_Mysql索引、查询计划、优化方向

索引

Innodb索引(聚集索引)(聚簇表分布)

%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7_2016-10-15_%E4%B8%8A%E5%8D%8811.14.50.png

Innodb是索引组织表,其结构是B+Tree。其表索引结构是聚簇表分布。

其叶子节点保存了Key+Row Data(聚集索引,按主键排序),其Key是主键或非空的唯一索引。而其二级索引是非主键或者非空的唯一索引。即Innodb表会把主键作为聚集索引,如果没有主键,会选择非空的唯一索引作为聚集索引。如果非空的唯一索引也没有的情况下,Innodb表会默认生成一个6bytes的id,默认作为主键成为聚集索引。

在创建表的时候要自己指定一个没有业务含义的主键,便于快捷插入

默认6字节的数据,到达数据上限时,不会报错,而是会直接覆盖数据

Myisam索引(非聚集索引)(非聚簇表分布)

%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7_2016-10-15_%E4%B8%8A%E5%8D%8811.26.18.png

Myiasm不管是主键索引还是二级索引,永远存储的是Key,数据则单独在表中。即非聚集索引,查询的时候要先查询索引,然后查询数据。

Innodb优化方向和注意事项

创建索引

需要注意的是创建索引不是越多越好,要注意基数和选择性。

基数:

一列数据,只有True和False两个结果。则这一列的基数是2

选择性:

列唯一键与行数的比值,在0-1之间。他的取值越小越好。选择性的值是根据表中值的数据而不一样的。基数为2的情况下,就有2个选择性的结果。

计算方法:相同值的数据总量➗表中数据的总量

如果Mysql中经常查询的方法是使用此列中选择性小的数据进行筛选和取出,那么可以对此建立索引提高效率。反之,如果经常使用选择性比较高的数据进行筛选,则不适合对此列建立索引,而应先考虑业务上的查询优化。

优化

禁止使用select *

使用select * 会查询大量数据并读取,不利于使用索引覆盖技术。

字符串查询

字符串查询的时候最好不要在开头进行模糊查询,从开头进行模糊查询难以使用索引快捷查找。

创建表的时候要有业务无关的自增主键

如果不使用自增主键的时候,系统默认的主键会有覆盖数据而不警告的风险。

大批量导入数据

如果大批量插入数据的时候,最好先将数据导入,然后再创建索引,同时进行批量提交而非单条提交。

对排序字段创建索引

order by高频调用的字段,对齐创建索引有助于快速排序。

避免使用limit a,b

Limit a,b 会取出a+b条记录。所以应该尽量避免,而使用limit a,并排序后限制>id。

执行计划

explain SQL Command

Example:

mysql> explain select ID,post_author,post_date,post_title,post_status,post_name from wp_posts;

+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+

| 1 | SIMPLE | wp_posts | NULL | ALL | NULL | NULL | NULL | NULL | 56 | 100.00 | NULL |

+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+

1 row in set, 1 warning (0.00 sec)

数据的查看方法

注意几点:

1. ID越大,优先级越高,越先被执行

2. ID相同,从上至下,按顺序执行

字段解释

ID

SQL语句的执行顺序

possible_keys

指出Mysql可以利用哪些索引在表中找到Row,如果查询的字段中存在索引,则会被列出在这个地方,如果没有的话就不会列出,如果有的话也并不代表会被使用。

key

Mysql实际在查询中使用到的索引,如果没有使用到索引,则不会被列出。

type

Mysql找到所需数据(Row)所使用的方式,称之为访问类型,按照查询的性能由差到好如下所示:

Type

Desc

ALL

Full Table Scan,Mysql会遍历整张表找到所需数据

index

Full Index Scan,Mysql只遍历索引树

range

索引范围扫描,Mysql对索引的扫描开始于某一点而非全部,常见于匹配值域(between,in, >, etc...)

ref

非唯一索引扫描,返回匹配某个单独值的所有数据。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找(=)

eq_ref

唯一索引扫描,即每个索引键只有一条记录与之匹配,常见于主键和唯一键

const,system

null

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度

keylen显示的值为索引字段的最大可能长度,并非实际使用长度。即keylen是根据表定义计算而得,不是通过表内检索出的

rows

Mysql根据表统计信息和索引状况,估算的影响到的数据的行数

ref

表示表的连接匹配条件

Extra

显示比较重要的额外信息

Using Index

表示Mysql在操作中使用了覆盖索引(Covering Index)

覆盖索引

MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件。包含所有满足查询需要的数据的索引称为覆盖索引。

覆盖索引切不可使用select *,否则会造成索引文件过于庞大,导致查询性能下降。

Using Where

表示Mysql使用Where字句过滤结果

Using Temporary

表示Mysql需要使用临时表来存储结果,一般见于排序和分组中

Using Filesort

表示Mysql无法利用索引完成排序,需要使用文件排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql kingshard 扩容_如何用Go打造一个高性能mysql proxy

kingshard架构设计和功能实现kingshard(https://github.com/flike/kingshard)开源有一段时间了,有些热心的用户发邮件来咨询kingshard的设计和实现问题。于是周末抽空写了一篇介绍kingshard架构和功能实现的文章,希望通过本文能够让用户对kingshard有更深…

玩转oracle 11g(27):ora-12154和客户端版本低

16. 64bit windows操作系统上 安装了32bit的oracle alert log 里不断的出现如下错误: OER 7451 in Load Indicator : Error Code OSD-04500: illegal option specified O/S-Error: (OS 1) 函数不正确。! 每10秒出现一次错误提示。 解决方案: 重新安装or…

mysql 命令行 主从复制_MySQL 的主从复制(高级篇)

首先要明白为什么要用 mysql 的主从复制:1–在从服务器可以执行查询工作 (即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)2–在从主服务器进行备份,避免备份期间影响主服务器服务;…

[Android]安装 Android Studio 第一行Android代码

安装 Android Studio 1.下载 官网 建议官网下载https://developer.android.com/index.html 网盘 链接:https://pan.baidu.com/s/1b8KyEMYbSYt9EQJ2e8Ge6w 提取码:ytn4 《第一行代码》第二版提供版本(2016年) 2.安装组件全…

玩转oracle 11g(28):ora-00064和程序异常终止

18.ORA-00064 object is too large to allocate on this OS 问题原因: 通过查看告警日志,确认修改的process过大 解决步骤: 使用 D:\oracle\product\10.2.0\admin\docare\pfile\init.ora 启动 操作步骤如下: sqlplus sys/docar…

android mysql sqlite_Android SQLite数据库基本操作方法

程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数据库来实现一…

python 元组遍历_Python中的for循环:元组、列表、字典的遍历和相互转化

Python for循环可以遍历任何序列的项目,如列表、字符串、元组、字典、集合等序列类型。语法:for循环的语法格式如下:for iterating_var in sequence:statements(s)流程图:animals"dog","cat","pig"…

玩转oracle 11g(30):ora-03135和plsql乱码问题

22. ORA-03135连接失去联系 如果应用程序时不时地报错“ORA-03135连接失去联系”, 该问题可能与sqlnet.ora设置参数SQLNET.EXPIRE_TIME 有关 在文件sqlnet.ora中,增加一行,单位分钟: SQLNET.EXPIRE_TIME = 10 23. Pls…

计算机论文搜索技巧【一】

如何搜素一个杂志里面的文章并下载?(以FSE为例) 1.在dblp搜索 FSE 点击相关链接 用google或 google scholar 跳转页面 2.找到类似 source Materials目录 点击查阅相关文档 找到相关信息 3.复制题目,结合dblp与 google scholar找到…

[众包]Eclipse 运行简单亚马逊AMT模板

教程 1.打开esclipe下载AMT 输入 https://aws.amazon.com/eclipse 下载后需要重启 需要自己在亚马逊先注册 填入分配的信息 注册教程 (需要信用卡 激活 创建账号 ) https://docs.aws.amazon.com/zh_cn/AWSMechTurk/latest/AWSMechanicalTurkGetting…

jmap 文件解析_干货分享丨jvm系列:dump文件深度分析

摘要:java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?JVM dumpjava内存dump是jv…

GAN 的推导、证明与实现。

转自机器之心整理的,来自Goodfellow 在 NIPS 2016 的演讲和台大李弘毅的解释,完成原 GAN 的推导、证明与实现。 本文主要分四部分,第一部分描述 GAN 的直观概念,第二部分描述概念与优化的形式化表达,第三部分将对 GAN …

玩转oracle 11g(32):plsql版本低需到配置文件中添加配置

1创建了一个数据库geyao,但是只能显示docare 2plsql版本太低,或者直接修改 C:\app\MDSD\product\11.2.0\dbhome_2\NETWORK\ADMIN 添加配置文件 出现歌谣

[测试智能合约]ganache+metamask+remix

1.谷歌浏览器 下载metamask 2.设置metamask 增加一个7545端口的网络 3.导入账户 从ganache的accounts里面随便找个账户的私钥传进去 4.打开remix 修改environment 5.写好的智能合约编译 remix经常抽风 疯狂来回切换版本号或者换网络 6.黄色按钮Deploy 7.同一页面最下方 打开部署…

Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence

使用Newtonsoft.Json反序列化收到的字串为JObject或其它支持的数据模型,有时错误,提示如下: Bad JSON escape sequence: \c. Path idno, line 5, position 34. 甚纳闷之。遂搜索资料,略有小获,其非法分界符所致。合法的…

玩转oracle 11g(33):无监听程序

故意操作删除监听 直接配置监听即可

mysql安装条款_mysql 安装注意

mysql 远程连接赋予权限:GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY datech WITH GRANT OPTION;FLUSH PRIVILEGES;MySQL 5.1采用了基于密码混编算法的鉴定协议,它与早期客户端(4.1之前)使用的协议不兼容。如果你将服务器升级到4.1之上&#xf…

java学习(126):throw向上抛出异常

//throw抛出异常 import java.util.Scanner; public class test66{static class A {void d() throws Exception {int a, b, c;Scanner in new Scanner(System.in);System.out.println("亲输入a的值");a in.nextInt();System.out.println("请输入b的值");…

[Java]集合的小抄 Java初学者必备

文章目录【背景】CollectionsListArrayList优势操作劣势操作LinkedList优势劣势最基本的两种检索集合中的所有对象的方法:CopyOnWriteArrayList补充说明StackMapMap 的常用方法:HashMapLinkedHashMapTreeMapConcurrentHashMapConcurrentSkipListMap补充说…