如何快速上手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,一经查实,立即删除!

相关文章

mysql blob 好处_MySQL中的BLOB类型

一、概念&#xff1a;BLOB (binary large object)二进制大对象&#xff0c;是一个可以存储二进制文件的容器。在计算机中&#xff0c;BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一个大文件&#xff0c;典型的BLOB是一张图片或一个声音文件&#xff0c;由于它们的…

mysql group by null_MySQL无GROUP BY直接HAVING返回空的问题分析

有一张表&#xff0c;id是主键&#xff0c;这样的写法可以返回一条记录&#xff1a;复制代码 代码如下:“SELECT * FROM t HAVING idMIN(id);”但是只是把MIN换成MAX&#xff0c;这样返回就是空了&#xff1a;复制代码 代码如下:“SELECT * FROM t HAVING idMAX(id);”这是为什…

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

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

python士兵突击_想自学Python进入该行业成为一名自己一直以来就很羡慕和钦佩的程序员,过来人的你有什么想分享的吗?...

多说无益就是干&#xff0c;学习编程也这样。我们下面主要通过以下三个步骤给出建议&#xff1a;1.确定目标(成为一个能干活的Python需要掌握哪些技能)。我们可以通过市面上对于Python工程师对招聘要求&#xff0c;去分析&#xff0c;具体需要掌握哪些内容。这个详细内容可以在…

启动项 mysql命令大全_mysql常用命令

一、登录mysql数据库1、连接本地mysql数据库,默认端口为3306#mysql –u root –p 123456 //-u&#xff1a;指定用户 -p&#xff1a;指定与用户对应的密码2、通过IP和端口连接远程mysql服务器#mysql –u root –p 123456 –h 192.168.100.1 –P 3306二、数据库操作语句1、显示所…

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

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

ubuntu16 黑主题_给Ubuntu 8.10安装超炫酷黑色新主题

Linux系统的Netbook定做了一套漂亮的界面,名称叫做 HP Mini 1000 Mi Edition。这套界面是基于 Ubuntu 8.04 Hardy Heron的,平常我们熟悉的Ubuntu程序等都可以在这里都使用.不过让 Mi Edition 脱颖而出的是这看起来根本不像是我们平时看过的Ubuntu界面, 看上去倒像媒体中心。这个…

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…

php和mysql的实践报告_PHP+MySQL项目开发与实践

前言部分基础篇任务一PHP基础知识简介1.1静态网页与动态网页的工作原理1.1.1静态网页与工作原理1.1.2动态网页与工作原理1.2初识PHP1.3习题任务二PHP程序的运行环境搭建2.1配置Apache服务器2.1.1安装Apache服务器2.1.2Apache服务器安装过程中的问题及解决方案2.1.3Apache主目录…

mediumint 在mysql 中是什么类型_mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围...

mysql数据库设计&#xff0c;其中&#xff0c;对于数据性能优化&#xff0c;字段类型考虑很重要&#xff0c;搜集了些资料&#xff0c;整理分享出来&#xff0c;这篇为有关mysql整型bigint、int、mediumint、smallint 和 tinyint的语法介绍&#xff0c;如下&#xff1a;1、bigi…

mysql备份还原数据库操作系统_mysql 命令行备份还原数据库操作

一 备份操作1.备份全部数据库mysqldump -uroot -p --all databases > aa.sql2.备份某个数据库并压缩mysqldump -uroot -p databasename |gzip > aa.sql.gz3 .备份单个表mysqldump -uroot -p -table dbname tbname1 tbname2 >aa.sql4.同时备份多个数据库mysqldump -ur…

python表示当前对象_对象操作

[TOC]# 对象操作## help:返回对象的帮助信息~~~>>> help(str)Help on class str in module builtins:class str(object)| str(object) -> str| str(bytes_or_buffer[, encoding[, errors]]) -> str|| Create a new string object from the given object. If enc…

中国大学慕课python答案第七章_中国大学慕课mooc用Python玩转数据章节答案

嵌体来源A.嵌入牙冠内的修复体 B.没有覆盖前牙唇面或后牙颊面的部分冠修复体艺术不是象牙塔里的_____ &#xff0c;所谓的“为艺术而艺术”&#xff0c;说到底不过是唯美主义_____的志向。自古以来&#xff0c;艺小轿车的速度比卡车的速度每小时快6千米&#xff0c;小轿车和卡车…

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

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

python迭代器是什么百度百科,python迭代器的接口是什么?

What are the required methods for defining an iterator? For instance, on the following Infinity iterator, are its methods sufficient? Are there other standard or de factor standard methods that define an iterator?class Infinity(object):def __init__(self…

python逻辑表达式3+45and_python入门到精通(一)| python基础语法与各种运算符的使用...

一、python中的基础语法1、输入语句 input格式&#xff1a;变量input(“输入提示信息”)功能&#xff1a;从键盘上输入一行文本信息到变量中&#xff0c;可以强转为各种数据类型。案例&#xff1a; xinput(“您的个人基本信息”)注意点&#xff1a;只能接受一行信息2 input语句…

java中文分词算法_Java实现逆向最大匹配中文分词算法

写道//Java实现逆向最大匹配中文分词算法public class SplitChineseCharacter {public static void main(String[] args) {String input "太好了&#xff0c;今天是星期六啊"; // 要匹配的字符串new Split(input).start();}}class Split {private String[] dictiona…

途牛java面试题_途牛java面试题.docx

途牛java面试题途牛java面试题  QUESTION NO: 1   publicclass Test1 {   publicstaticvoid changeStr(String str){   str"welcome";   }   publicstaticvoid main(String args) {   String str"1234";   changeStr(str);   (str);   …