MYSQL入门(三)
索引简介
索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引插叙的速度要比没有索引的速度要快很多
MySQL中常见索引有:
- 普通索引
- 唯一索引
- 主键索引
- 组合索引
下面就应用一下索引吧
索引操作
一、普通索引(index)
普通所以只有一个功能,就是加快查找速度。操作如下
1、先创建一个表

- create table tab1(
- nid int not null auto_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 null auto_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 null auto_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 null auto_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 from tb1 order by name desc;
- 当根据索引排序时候,选择的映射如果不是索引,则不走索引
- 特别的:如果对主键排序,则还是走索引:
- select * from tb1 order by nid desc;
- 8、 组合索引最左前缀
- 如果组合索引为:(name,email)
- name and email -- 使用索引
- name -- 使用索引
- email -- 不使用索引

2、其他注意事项
避免使用
select
*
count
(1)或
count
(列) 代替
count
(*)
创建表时尽量时
char
代替
varchar
表的字段顺序固定长度的字段优先
组合索引代替多个单列索引(经常使用多个条件查询时)
尽量使用短索引
使用连接(
JOIN
)来代替子查询(Sub-Queries)
连表时注意条件类型需一致
索引散列值(重复少)不适合建索引,例:性别不适合
3、执行计划
explain + 查询SQL - 用于显示SQL执行信息参数,根据参考信息可以进行SQL优化

- mysql> explain select * from tb2;
- +----+-------------+-------+------+---------------+------+---------+------+------+-------+
- | 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)

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

- 每页显示10条:
- 当前 118 120, 125
- 倒序:
- 大 小
- 980 970 7 6 6 5 54 43 32
- 21 19 98
- 下一页:
- select
- *
- from
- tb1
- where
- nid < (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
- *
- from
- tb1
- where
- nid < (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
- *
- from
- tb1
- where
- nid < (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
- *
- from
- tb1
- where
- nid < (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;

MYSQL入门(三)的更多相关文章
- <MySQL>入门三 数据定义语言 DDL
-- DDL 数据定义语言 /* 库和表的管理 一.库的管理:创建.修改.删除 二.表的管理:创建.修改.删除 创建:create 修改:alter 删除:drop */ 1.库的管理 -- 库的管理 ...
- MySQL入门(三)
写了两篇<MySQL入门>以后我发现,写书的人还是都挺有本事的,起码人家知道怎么编排自己想讲的知识点,我实在是不知道该先说那里后说哪里,那我就想到什么讲什么吧. 一 写SQL 其实我是不想 ...
- MySQL概述及入门(三)
MySql概述及入门(三) MySQL性能优化 主要优化安全和性能方面 安全方面 : 数据可持续性 性能方面 : 数据的高性能访问 性能优化——慢查询 在MySQL数据库中有一个慢查询日志功能,去获取 ...
- 【数据库】3.0 MySQL入门学习(三)——Windows系统环境下MySQL安装
1.0 我的操作系统是window10 专业版 64位.,不过至少windows7以上系统都是一样的. 关于MySQL如何下载,请参考博文: [数据库]2.0 如何获得MySQL以及MySQL安装 h ...
- Mysql快速入门(三)
MySQL性能优化之查看执行计划explain 介绍: (1).MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发 ...
- 21分钟 MySQL 入门教程(转载!!!)
21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...
- MYSQL入门全套(第三部)
MYSQL入门全套(第一部) MYSQL入门全套(第二部) 索引简介 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构.如果想按特定职员的姓来查找 ...
- MySQL入门笔记
MySQL入门笔记 版本选择: 5.x.20 以上版本比较稳定 一.MySQL的三种安装方式: 安装MySQL的方式常见的有三种: · rpm包形式 · 通用二进制 ...
- MySQL入门转载
21分钟 MySQL 入门教程 http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html 目录 一.MySQL的相关概念介绍 二.Wi ...
随机推荐
- 用RxJava处理复杂表单验证问题
用RxJava处理复杂表单验证问题 无论是简单的登录页面,还是复杂的订单提交页面,表单的前端验证(比如登录名和密码都符合基本要求才能点亮登录按钮)都是必不可少的步骤.本文展示了如何用RxJava来方便 ...
- Mysql之case语句(附带实例)
这段时间,做项目做累了,好不容易有点个人的学习时间,利用这个小时,总结一下,最近做统计的时候常用的case语句吧. 结构:case when… then …end 1.判断的同时改变其值 eg: ...
- 20160307 - 双击打开 Js 扩展名的附件要保持留心
Windows Script Host 技术是一门很老的技术,它让 Windows 的自带脚本 VBScript 和 JScript 可以操作 Windows ActiveX 对象,这样的脚本具有本地 ...
- 20160205 - Windows 10 家庭版没有组策略
问题描述:买笔电自带的正版系统,有一个需要使用gpedit.msc,发现并不存在. 解决办法:升级到 Windows 10 专业版
- C# 调用一个按钮的Click事件(利用反射)
最基本的调用方法 (1)button1.PerformClick();(2)button1_Click(null,null);(3)button_Click(null,new EventArgs()) ...
- ubuntu完全卸载nginx
删除nginx连带配置文件 sudo apt-get purge nginx # Removes everything. 卸载不再需要的nginx依赖程序 sudo apt-get autoremov ...
- 最完整的Elasticsearch 基础教程
翻译:潘飞(tinylambda@gmail.com) 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT) Ela ...
- Swift基础--可选绑定和守护绑定
Swift中的可选绑定和守护绑定 1.可选绑定 格式 // 通过url来创建request对象 if let tempUrl = url { // url为可选类型,当可选类型有值,才执行大括号里面的 ...
- 【转】c# 调用windows API(user32.dll)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- css 小三角
span{ display: inline-block; border-top: 100px solid red; border-right: 100px solid transparent; bor ...