如何快速上手mysql_mysql快速上手3

上一章给大家说的是数据库的视图,存储过程等等操作,这章主要讲索引,以及索引注意事项,如果想看前面的文章,url如下:

索引简介

索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引插叙的速度要比没有索引的速度要快很多

MySQL中常见索引有:

普通索引

唯一索引

主键索引

组合索引

下面就应用一下索引吧

索引操作

一、普通索引(index)

普通所以只有一个功能,就是加快查找速度。操作如下

1、先创建一个表

create table tab1(

nid int not nullauto_increment primary key,

name varchar(32) not null,

email varchar(64) not null,

extra text,

index ix_name (name)

)

2、创建索引

create index 索引名称 on 表名(列名)

3、删除索引

drop 索引名称 on 表名;

4、查看索引

show index from 表名;

5、注意事项(对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length。)

create index index_name on tab1(extra(32));

二、唯一索引(unique)

唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的。

1、创建表+唯一索引

create table tab2(

nid int not nullauto_increment primary key,

name varchar(32) not null,

email varchar(64) not null,

extra text,

unique ix_name (name) --重点在这里

)

2、创建索引

create unique index 索引名 on 表名(列名)

3、删除索引

drop unique index 索引名 on 表名

三、主键索引

在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。数据不能为空

1、创建表+主键索引

create table in1(

nid int not nullauto_increment,

name varchar(32) not null,

email varchar(64) not null,

extra text,

primary key(nid),

index zhang (name)

)

2、创建主键

alter table 表名 add primary key(列名);

3、删除主键

alter table 表名 drop primary key;

alter table 表名 modify 列名 int, drop primary key;

四、组合索引

组合索引,就是组合查询的意思嘛嘻嘻,将两列或者多列组合成一个索引进行查询

其应用场景为:频繁的同时使用n列来进行查询,如:where name = '张岩林' and email = 666。

1、创建表

create table in3(

nid int not nullauto_increment primary key,

name varchar(32) not null,

email varchar(64) not null,

extra text

)

2、创建组合索引

create index ix_name_email on in3(name,email);

如上创建组合索引之后,查询有的会使用索引,有的不会:

name and email  -- 使用索引

name                 -- 使用索引

email                 -- 不使用索引

索引注意事项

1、正确使用索引

数据库表中添加索引后能够让查询数据库速度飞快,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。

下面这些情况不会使用到索引:

1、like '%xx'

select * from tb1 where name like '%cn';

2、使用函数

select * from tb1 where reverse(name) = '张岩林';

3、or

select * from tb1 where nid = 1 or email='zhangyanlin@live.com';

特别的:当or条件中有未建立索引的列才失效,以下会走索引

select * from tb1 where nid = 1 or name = 'zhangyanlin';

select * from tb1 where nid = 1 or email = 'zhangyanlin@live.com' and name = 'aylin'

4、类型不一致

如果列是字符串类型,传入条件是必须用引号引起来,不然...

select * from tb1 where name = 999;

5、 !=

select * from tb1 where name != 'aylin'特别的:如果是主键,则还是会走索引

select * from tb1 where nid != 123

6、 >

select * from tb1 where name > 'alex'特别的:如果是主键或索引是整数类型,则还是会走索引

select * from tb1 where nid > 123

select * from tb1 where num > 123

7、order by

select email fromtb1 order by name desc;

当根据索引排序时候,选择的映射如果不是索引,则不走索引

特别的:如果对主键排序,则还是走索引:

select * fromtb1 order by nid desc;

8、 组合索引最左前缀

如果组合索引为:(name,email)

name and email --使用索引

name --使用索引

email -- 不使用索引

2、其他注意事项

避免使用select *

3、执行计划

explain + 查询SQL - 用于显示SQL执行信息参数,根据参考信息可以进行SQL优化

mysql> explain select * fromtb2;

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

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

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

| 1 | SIMPLE | tb2 | ALL | NULL | NULL | NULL | NULL | 2 | NULL |

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

1 row in set (0.00 sec)

id

查询顺序标识

如:mysql> explain select * from (select nid,name from tb1 where nid < 10) asB;

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

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

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

| 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 9 | NULL |

| 2 | DERIVED | tb1 | range | PRIMARY | PRIMARY | 8 | NULL | 9 | Using where |

+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+特别的:如果使用union连接气值可能为null

select_type

查询类型

SIMPLE 简单查询

PRIMARY 最外层查询

SUBQUERY 映射为子查询

DERIVED 子查询

UNION 联合

UNION RESULT 使用联合的结果

...

table

正在访问的表名

type

查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/constALL 全表扫描,对于数据表从头到尾找一遍

select * fromtb1;

特别的:如果有limit限制,则找到之后就不在继续向下扫描

select * from tb1 where email = 'seven@live.com'

select * from tb1 where email = 'seven@live.com' limit 1;

虽然上述两个语句都会进行全表扫描,第二句使用了limit,则找到一个后就不再继续扫描。

INDEX 全索引扫描,对索引从头到尾找一遍

select nid fromtb1;

RANGE 对索引列进行范围查找

select * from tb1 where name < 'alex';

PS:

between and

in

> >= < <=操作

注意:!= 和 >符号

INDEX_MERGE 合并索引,使用多个单列索引搜索

select * from tb1 where name = 'alex' or nid in (11,22,33);

REF 根据索引查找一个或多个值

select * from tb1 where name = 'seven';

EQ_REF 连接时使用primary key 或 unique类型

select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid =tb1.nid;

CONST 常量

表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次。

select nid from tb1 where nid = 2;

SYSTEM 系统

表仅有一行(=系统表)。这是const联接类型的一个特例。

select * from (select nid from tb1 where nid = 1) asA;

possible_keys

可能使用的索引

key

真实使用的

key_len

MySQL中使用索引字节长度

rows

mysql估计为了找到所需的行而要读取的行数 ------只是预估值

extra

该列包含MySQL解决查询的详细信息

“Using index”

此值表示mysql将使用覆盖索引,以避免访问表。不要把覆盖索引和index访问类型弄混了。

“Using where”

这意味着mysql服务器将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引。

“Using temporary”

这意味着mysql在对查询结果排序时会使用一个临时表。

“Using filesort”

这意味着mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成。

“Range checked foreach record(index map: N)”

这个意味着没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列中索引的位图,并且是冗余的。

4、limit分页

分页功能是个值得关注的问题,因为我们会一直用到

48304ba5e6f9fe08f3fa1abda7d326ab.png

每页显示10条:

当前 118 120, 125倒序:

大 小

980 970 7 6 6 5 54 43 32

21 19 98下一页:

select

*

fromtb1

wherenid < (select nid from (select nid from tb1 where nid < 当前页最小值 order by nid desc limit 每页数据 *【页码-当前页】) A order by A.nid asc limit 1)

order by

nid desc

limit 10;

select

*

fromtb1

wherenid < (select nid from (select nid from tb1 where nid < 970 order by nid desc limit 40) A order by A.nid asc limit 1)

order by

nid desc

limit 10;

上一页:

select

*

fromtb1

wherenid < (select nid from (select nid from tb1 where nid > 当前页最大值 order by nid asc limit 每页数据 *【当前页-页码】) A order by A.nid asc limit 1)

order by

nid desc

limit 10;

select

*

fromtb1

wherenid < (select nid from (select nid from tb1 where nid > 980 order by nid asc limit 20) A order by A.nid desc limit 1)

order by

nid desc

limit 10;

转载:http://www.cnblogs.com/aylin/p/5777289.html

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

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

相关文章

c mysql 免安装版_MySQL5.6免安装版环境配置图文教程

MySQL是一个小巧玲珑但功能强大的数据库&#xff0c;目前十分流行。但是官网给出的安装包有两种格式&#xff0c;一个是msi格式&#xff0c;一个是zip格式的。很多人下了zip格式的解压发现没有setup.exe&#xff0c;面对一堆文件一头雾水&#xff0c;不知如何安装。下面小编将介…

MDL锁导致mysql夯住_MySQL MetaData Lock 案例分享

前言&#xff1a;今天开发童鞋遇到一个奇怪的问题&#xff0c;在测试环境里面执行drop database dbname发现一直夯住不动&#xff0c;等了很久也没有执行&#xff0c;于是问题就到我这里了一、什么是MetaData Lock&#xff1f;MetaData Lock即元数据锁&#xff0c;在数据库中元…

docker 分布式管理群集_Coolpy7分布式物联网MQTT集群搭建

Coolpy7分布式技术&#xff0c;支持多个Coolpy7 Core提供跨数据中心(多活)模式组建群集&#xff0c;支持群集零手动维护(基于Gossip分布式协议作为群集节点状态维护)。Coolpy7从版本号V7.3.2.3开始支持本功能。请到Coolpy7之github项目release下载相关版本https://github.com/C…

vue 数值 拼接字符串_【Vue原理】Compile - 白话版

写文章不容易&#xff0c;点个赞呗兄弟 专注 Vue 源码分享&#xff0c;文章分为白话版和 源码版&#xff0c;白话版助于理解工作原理&#xff0c;源码版助于了解内部详情&#xff0c;让我们一起学习吧 研究基于 Vue版本 【2.5.17】如果你觉得排版难看&#xff0c;请点击 下面链…

gpio驱动蜂鸣器出现破音_五款蜂鸣器驱动电路原理图

蜂鸣器驱动电路图一&#xff1a;典型的蜂鸣器驱动电路&#xff0c;蜂鸣器驱动电路一般包含&#xff1a;一个三极管、一个蜂鸣器、一个续流二极管、一个滤波电容。1、蜂鸣器&#xff1a;发声元件&#xff0c;在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声&am…

mysql 多项式_mysql主从复制原理及实现

一.主从复制原理利用MySQL提供的Replication&#xff0c;其实就是Slave从Master获取Binary log文件&#xff0c;然后再本地镜像的执行日志中记录的操作。由于主从复制的过程是异步的&#xff0c;因此Slave和Master之间的数据有可能存在延迟的现象&#xff0c;此时只能保证数据最…

idea创建web项目运行报404错误_使用IDEA新建Web工程启动报404的错误

新换了一个项目组被人吐槽配置文件都能写错&#xff0c;所以打算从头开始一步步搭建一个项目&#xff0c;包含ssm基础框架、mongodb工具类、redis工具类、jsf配置、log配置等今天先来搭建一个web工程。工程搭建好运行时发现404我们都知道&#xff0c;一般404都是由于请求资源的…

java md2_GitHub - edzjx/Md2Crypto

此项目来源一个字谜解体过程一个程序猿在自己的微信公众号里出了一个字谜。其中用到了MD2加密算法&#xff0c;这是各很古老的加密算法。从网上搜到作者92年发布的C代码还能正常执行。此项目介绍解题过程&#xff0c;和使用C&#xff0c;C#,Java,Python3来测试代码。文章结构破…

java stringbuffer原理_深入理解Java:String

在讲解String之前&#xff0c;我们先了解一下Java的内存结构。一、Java内存模型按照官方的说法&#xff1a;Java 虚拟机具有一个堆&#xff0c;堆是运行时数据区域&#xff0c;所有类实例和数组的内存均从此处分配。JVM主要管理两种类型内存&#xff1a;堆和非堆&#xff0c;堆…

java dubbo jsf_cubelink

cubelink概要设计[TOC]1. 撰写记录更新时间内容作者2017-08-23 08:39:31撰写参数回调章节内容林斌2017-08-22 21:26:52增加了异步响应和异步回调章节林斌2017-08-22 14:36:36确定文档结构和大致框架林斌2. 设计目标设计一个具备治理&#xff0c;监控&#xff0c;服务发现能力的…

python 的案例实战_python案例实战之一

分析思路&#xff1a;1、明确分析目标&#xff1b;2、导入库、导入数据&#xff1b;3、简单查看下数据行列、整体情况&#xff1b;4、数据清洗&#xff1b;5、确定维度和指标&#xff1b;6、分析并作图1、查看整体数据情况1.1引入使用的库import numpy as npimport pandas as p…

java数据结构期末复习_java数据结构复习02

1.递归问题1.1计算阶乘packageinterview.recursion;importjava.util.Scanner;public classFact {public static voidmain(String[] args) {System.out.println("请输入n的值&#xff1a;");Scanner in newScanner(System.in);int n in.nextInt();int num fact(n);Sys…

java中methods方法_java中Class.getMethod方法

Method Class.getMethod(String name, Class>... parameterTypes)的作用是获得对象所声明的公开方法该方法的第一个参数name是要获得方法的名字&#xff0c;第二个参数parameterTypes是按声明顺序标识该方法形参类型。person.getClass().getMethod("Speak", null)…

centos6 yum快速安装mysql_centos6.10 yum安装mysql 5.6-Go语言中文社区

一、检查系统是否安装其他版本的MYSQL数据#yum list installed | grep mysql#yum -y remove 文件名二、安装及配置# wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm# rpm -ivh mysql-community-release-el6-5.noarch.rpm# yum repolist all | grep mysq…

二叉树两节点距离java,求二叉树中两个节点的最远距离

问题定义如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节…

php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?

以往写cli下运行的业务或者测试代码&#xff0c;总是新建文件&#xff0c;面向过程编写代码。几次之后&#xff0c;cli目录下好多文件&#xff0c;即便勉强在一个cli测试文件中写了一个类&#xff0c;也是让其中的一个方法自启动&#xff0c;要测试别的方法&#xff0c;总是要修…

php中gd为什么是乱码的,php gd库中文乱码怎么解决?

php gd库中文乱码怎么解决&#xff1f;,中文,乱码,字符,选项,字体php gd库中文乱码怎么解决&#xff1f;易采站长站&#xff0c;站长之家为您整理了php gd库中文乱码怎么解决&#xff1f;的相关内容。解决方法&#xff1a;1、网站整站使用UTF8编码&#xff0c;如果已使用GB2312…

php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)

原标题&#xff1a;JS实现网站图片飘窗效果&#xff0c;JavaScript悬浮广告(附详细代码)JS实现网站图片飘窗效果&#xff0c;Java悬浮广告&#xff0c;郑州SEO提供以下代码&#xff0c;仅供参考&#xff1a;飘窗效果-丁光辉博客(www.dingguanghui.com)*{margin:0px;padding:0px…

oracle中orand使用,Postgres兼容Oracle研究——orafce调研

一、背景PostgreSQL是和Oracle最接近的企业数据库&#xff0c;包括数据类型&#xff0c;功能&#xff0c;架构和语法等几个方面。甚至大多数的日常应用的性能也不会输给Oracle。但是Oracle有些函数或者包&#xff0c;默认PostgreSQL是没有的&#xff0c;需要安装orafce包来实现…

labview linux 内核 不匹配,Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。...

Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退&#xff0c;LabVIEW就崩溃。我安装了LabVIEW pro 2017 for Linux(另外也试了2016版的都是一样的效果)&#xff0c;VISA也试了4.1.0、4.4.0、5.1.1、15.0.0、15.5.0、16.0.0、17.0.0版本都试过了&#…