MYSQL初级学习笔记九:MySQL索引的使用!(视频序号:初级_51)
知识点十一:索引的使用(51)
什么是索引:
索引的定义:
在关系型数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行的更快。索引的作用相当于图书的目录,可以
根据目录中的页码快速找到所需要的内容。在关系型数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。
索引的原理:
二叉树 --> 索引文件:效率:log2N
例如:检测10次:2的10次方。1024条记录
索引带来的开销:
查看数据文件(安装目录下的data目录),会发现有三个文件(ISAM引擎下):
.frm:表示文件结构
.myd:表示数据
.myi:表示索引的文件
索引带来的问题:会导致insert,uodate,delete的效率降低。
更新非常频繁的字段不适合创建索引。
唯一性比较差的字段不适合创建索引。比如人的性别只有男和女。
满足以下条件的字段才会创建索引:
肯定在WHERE条件中经常使用到的。
该字段变化不会太频繁。
总结:
索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度
索引的优点是可以提高检索数据的速度
索引的缺点是创建和维护索引需要耗费时间
索引可以提高查询速度,会减慢写入速度
索引的分类:
普通索引:
所谓普通索引,就是在创建索引时,不附加任何限制条件(唯一,非空等限制)。该类型的索引可以创建在任何数据类型的字段上。
--创建数据库并添加索引
CREATE TABLE test4(
id TINYINT UNSIGNED,
username VARCHAR(20),
INDEX in_id(id),
KEY in_username(username)
);
INSERT INTO test4 VALUES (1,'aa'),
(2,'bb'),
(3,'cc'); --删除索引
DROP INDEX in_id ON test4;
DROP INDEX in_username ON test4; --添加索引
CREATE INDEX in_id ON test4(id);
ALTER TABLE test4 ADD INDEX in_username(username); --校验索引是否被引用
EXPLAIN SELECT * FROM test4 WHERE id>0\G
EXPLAIN SELECT id FROM test4 \G --通过SHOW PROFILE分析SQL
--开启新的窗口,并指定数据库
SELECT @@have_profiling; SET PROFILING =1; SELECT COUNT(*) FROM test4;
SHOW PROFILES;
SHOW PROFILE FOR query 1;
普通索引测试
唯一索引:
所谓唯一索引,就是在创建索引时,限制索引的值必须唯一。通过该类型索引,可以更快速地查询某条语句。
注意:
唯一的索引所在的列可以重复有NULL值;
唯一的索引所在的列不能为空字符串。
--创建数据库并添加索引
CREATE TABLE test5(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
card CHAR(18) NOT NULL,
UNIQUE KEY uni_card(card)
);
INSERT INTO test5 VALUES (1,'aa',''),
(2,'bb',''),
(3,'cc',''); --删除索引
ALTER TABLE test5 DROP INDEX uni_card;
DROP INDEX username ON test5; --添加索引
CREATE UNIQUE INDEX uni_username ON test5(username);
ALTER TABLE test5 ADD UNIQUE INDEX uni_card(card); --校验索引是否被引用
EXPLAIN SELECT * FROM test5 WHERE id>0\G
EXPLAIN SELECT id FROM test5 \G --通过SHOW PROFILE分析SQL
--开启新的窗口,并指定数据库
SELECT @@have_profiling; SET PROFILING =1; SELECT COUNT(*) FROM test5;
SHOW PROFILES;
SHOW PROFILE FOR query 1;
唯一索引测试
全文索引:
全文索引主要关联在数据类型为CHAR,VARCHAR和TEXT的字段上,以便能够更快加速地查询数据量较大地字符串类型地字段。
MySQL从3.23.23版本开始支持全文索引,只能在存储引擎为MyISAM地数据库表上创建全文索引。在默认情况下,全文索引地搜索执行方式为不区分大小写,
如果全文索引所关联地字段为二进制数据类型,则以区分大小写地搜索方式执行。
FULLTEXT索引,用于全文索引。只有MyISAM表类型支持FULLTEST索引。FULLTEXT索引只可以从CHAR,VARCHAR和TEXT列中创建。整个列都会被编入索引,不支持对部分列编入索引。
--创建数据库并添加索引
CREATE TABLE test6(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
userDesc VARCHAR(20) NOT NULL,
FULLTEXT INDEX full_userDesc(userDesc)
)ENGINE=MyISAM;
INSERT INTO test6 VALUES (1,'aa',''),
(2,'bb',''),
(3,'cc',''); --删除索引
DROP INDEX full_userDesc ON test6; --添加索引
CREATE FULLTEXT INDEX full_userDesc ON test6(userDesc); --校验索引是否被引用
EXPLAIN
SELECT * FROM test6
WHERE MATCH (userDesc) AGAINST ('')\G --通过SHOW PROFILE分析SQL
--开启新的窗口,并指定数据库
SELECT @@have_profiling; SET PROFILING =1; SELECT COUNT(*) FROM test6;
SHOW PROFILES;
SHOW PROFILE FOR query 1;
全文索引测试
单列索引:
-- 创建单列索引
CREATE TABLE test7(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,
test3 VARCHAR(20) NOT NULL,
test4 VARCHAR(20) NOT NULL,
INDEX in_test1(test1)
);
单列索引测试
多列索引
所谓多列索引,是指在创建索引时,所关联的字段不是一个字段,而是多个字段。虽然可以通过过关联的字段进行查询,但是只有查询条件中使用了关联字段中的第一个字段,多列索引才会被启用。
-- 创建多列索引
CREATE TABLE test8(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,
test3 VARCHAR(20) NOT NULL,
test4 VARCHAR(20) NOT NULL,
INDEX mul_t1_t2_t3(test1,test2,test3)
); ALTER TABLE test8 DROP INDEX mul_t1_t2_t3;
ALTER TABLE test8 ADD INDEX mul_ti_t2_t3(test1,test2,test3); --创建唯一性的多列索引
CREATE TABLE test9(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,
test3 VARCHAR(20) NOT NULL,
test4 VARCHAR(20) NOT NULL,
UNIQUE KEY mul_t1_t2_t3(test1,test2,test3)
);
多列索引测试
空间索引
-- 创建空间索引
CREATE TABLE test10(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
test GEOMETRY NOT NULL,
SPATIAL INDEX spa_test(test)
)ENGINE=MyISAM; DROP INDEX spa_test ON test10; CREATE SPATIAL INDEX spa_test ON test10(test);
空间索引测试
如何创建索引:
(1)创建表的时候创建索引:
CREATE TABLE tbl_name( 字段名称 字段类型 [完整性约束条件], …, [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名称] (字段名称[(字段长度)] [ASC | DESC]);
(2)在已经存在的表上创建索引:
CREATE [UNIQUE | FULLTEXT |SPATIAL] INDEX 索引名称 ON 表名 {字段名称] [(字段长度)] [ASC | DESC]}; ALTER TABLE tbl_name ADD [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名称(字段名称[字段名称[(字段长度)] [ASC | DESC];
如何删除索引:
DROP INDEX 索引名称 ON tbl_name;
如何查询索引:
SHOW KEYS FROM 表名; SHOW INDEXES FROM 表明;
查看索引是否被调用:
EXPLAIN
SELECT * FROM til_name WHERE '一个存在的条件'\G;
通过EXPLAIN分析索引是否被启用。
通过SHOW PROFILE分析SQL执行低效的SQL语句。
1.首先查看MySQL是否支持SHOW PROFILE:
SELECT @@HAVE_PROFILING;
2,如果PROFILE时关闭的,可以通过SET语句在session级别开启PROFILEING
SET PROFILING=1;
3.执行完毕之后,可以通过SHOW PROFILES语句,查看当前SQL的Query_ID。
SHOW PROFILES;
4.通过SHOW PROFILES FOR QUERY query_ID查看执行语句各处用时;
索引的常用应用案例:
MySQL在以下操作场景下会使用索引:
1.快速查找符合WHERE条件的记录;
2.快速确定候选集。若WHERE条件使用了多个索引字段,则MySQL会优先使用能使候选记录集规模最小的那个索引,以便尽快淘汰不符合条件的记录。
3.如果表中存在几个字段构成的联合索引,则查找记录时,这个联合索引的最左前缀匹配字段也会被自动作为索引来加速查找。
例如:若为某表创建3个字段(c1,c2,c3)构成的联合索引,则(c1),(c1,c2),(c1,c2,c3)均会作为索引,(c1,c3)就不会作为索引,而(c1,c3)其实只利用到(c1)索引。
4.多表做join操作时会使用索引(如果参与join字段在这些表中均建立了索引的话)
5.若某字段已建立索引,求该字段的MIN()或MAX()时,MySQL会使用索引
6.对建立了索引的字段做SORT或GROUP操作时,MySQL会使用索引
MYSQL初级学习笔记九:MySQL索引的使用!(视频序号:初级_51)的更多相关文章
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
- 【转】MYSQL入门学习之九:索引的简单操作
转载地址:http://www.2cto.com/database/201212/176772.html 一.创建索引 www.2cto.com MYSQL常用的索引类型主要有以 ...
- mysql的学习笔记(九)
mysql不支持FULL JOIN时可用UNION ALL代替 SELECT t1.user_id,t2.user_name FROM t1 LIFT JOIN t2 ON t1.user_id = ...
- MYSQL进阶学习笔记九:MySQL事务的应用!(视频序号:进阶_21-22)
知识点十:MySQL 事务的应用 (21-22) 为什么要引入事务: 为什么要引入事务这个技术呢?现在的很多软件都是多用户,多程序,多线程的.对同一表可能同时有很多人在用,为保持数据的一致性,所以提出 ...
- linux初级学习笔记九:linux I/O管理,重定向及管道!(视频序号:04_3)
本节学习的命令:tr,tee,wc 本节学习的技能: 计算机的组成 I/O管理及重定向 管道的使用 知识点九:管理及IO重定向(4_3) 计算机组成: 运算器.控制器: CPU 存储器:RAM ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 基于【 MySql 】二 || mysql详细学习笔记
mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...
- Mysql事务学习笔记
Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ...
随机推荐
- Xcode打包应用为ipa
Xcode教程 Xcode4发布测试 打包Archive操作是本文要介绍的内容,发布测试的最后一步打包(Archive),Xcode4帮助文档有比较详细介绍,但是居然是错的,这里说明一下. 1.设置& ...
- android中bitmap图片与二进制,String间的转化
1, public Bitmap stringtoBitmap(String string) { // 将字符串转换成Bitmap类型 ...
- Codeforces 655E Beautiful Subarrays【01trie树】
题目链接: http://codeforces.com/contest/665/problem/E 题意: 求异或值大于给定K的区间个数. 分析: 首先我们可以得到区间前缀的异或值. 这样我们将这个前 ...
- 洛谷——P1290 欧几里德的游戏
P1290 欧几里德的游戏 题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的 ...
- Spring Boot使用Schedule实现定时任务
适用的工具是:Schedule 集成步骤: 1.开启Schedule支持 package com.jsoft.springboottest.springboottest1; import org.sp ...
- 关于克隆gitlab项目的一些 问题列表
1. gitLab项目clone过后, 运行ng serve出错: 解决方式: npm install -g node-gyp npm install --global --production wi ...
- Java主线程等待所有子线程执行完毕再执行解决办法(转)
方法一: Thread.join()方法,亲测可行,thread.join()方法 Vector<Thread> ts = new Vector<Thread>(); for ...
- MySQL---笔记之视图的使用详解
什么是视图 视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据. 这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据. ...
- 王立平--Gallery:实现图片的左右滑动
<span style="font-size:18px;color:#330033;">package com.main; import android.app.Act ...
- JQUERY多选框,单选框,检查选中的值
var str=""; $(":checkbox:checked").each(function(){ if($(this).attr("checke ...