mysql的几种索引

为什么创建索引后,速度就会变快?

答:使用索引后,查询是按二叉树算法来查找到记录

索引使用的注意事项:

索引的代价:

1. 占用磁盘空间

2. 对dml(新增、修改、删除)操作有影响,变慢

哪些列适合添加索引:

1. 较频繁的作为查询条件字段应该创建索引
select * from emp where empno = 1
2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
select * from emp where sex = ‘男‘
3. 更新非常频繁的字段不适合创建索引
select * from emp where logincount = 1
4. 不会出现在WHERE子句中字段不该创建

总结: 满足以下条件的字段,才应该创建索引.

a: 肯定在where条经常使用

b: 该字段的内容不是唯一的几个值(sex)

c: 字段内容不是频繁变化.

使用索引的注意事项

把dept表中,我增加几个部门:

alter table dept add index my_ind (dname,loc); // dname 左边的列,loc就是右边的列

说明,如果我们的表中有复合索引(索引作用在多列上), 此时我们注意:

1, 对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。

explain select * from dept where loc=‘aaa‘\G

就不会使用到索引

2,对于使用like的查询,查询如果是 ‘%aaa’ 不会使用到索引

‘aaa%’ 会使用到索引。

比如: explain select * from dept where dname like ‘%aaa‘\G

不能使用索引,即,在like查询时,关键的 ‘关键字’ , 最前面,不能使用 % 或者 _这样的字符., 如果一定要前面有变化的值,则考虑使用 全文索引->sphinx.

1. 如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or 关键字

select * from dept where dname=’xxx’ or loc=’xx’ or deptno=45

2. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须’’), 也就是,如果列是字符串类型,就一定要用 ‘’ 把他包括起来.

3. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引

explain 可以帮助我们在不真正执行某个sql语句时,就执行mysql怎样执行,这样利用我们去分析sql指令.

如何查看索引使用的情况:

show status like ‘Handler_read%’;

大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next:这个值越高,说明查询低效。

sql语句的小技巧

1. 在使用group by 分组查询是,默认分组后,还会排序,可能会降低速度.

比如:

在group by 后面增加 order by null 就可以防止排序.

1. 有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。

select * from dept, emp where dept.deptno=emp.deptno; [简单处理方式]

select * from dept left join emp on dept.deptno=emp.deptno; [左外连接,更ok!]

======================================================================

创建索引有四种方式分别是:主键索引、唯一索引、全文索引、普通索引

1、主键索引

当一张表,把某个列设为主键的时候,则该列就是主键索引

create table aaa

(id int unsigned primary key auto_increment ,

name varchar(32) not null defaul ‘’);

这是id 列就是主键索引.

如果你创建表时,没有指定主键索引,也可以在创建表后,在添加, 指令:

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

举例:

create table bbb (id int , name varchar(32) not null default ‘’);

alter table bbb add primary key (id);

2、普通索引

一般来说,普通索引的创建,是先创建表,然后在创建普通索引

比如:

create table ccc(

id int unsigned,

name varchar(32)

)

create index 索引名 on 表 (列1,列名2);

3、全文索引

全文索引,主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用.

创建 :

CREATE TABLE articles (

id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

title VARCHAR(200),

body TEXT,

FULLTEXT (title,body)

)engine=myisam charset utf8;

添加数据:

INSERT INTO articles (title,body) VALUES

(‘MySQL Tutorial‘,‘DBMS stands for DataBase ...‘),

(‘How To Use MySQL Well‘,‘After you went through a ...‘),

(‘Optimizing MySQL‘,‘In this tutorial we will show ...‘),

(‘1001 MySQL Tricks‘,‘1. Never run mysqld as root. 2. ...‘),

(‘MySQL vs. YourSQL‘,‘In the following database comparison ...‘),

(‘MySQL Security‘,‘When configured properly, MySQL ...‘);

如何使用全文索引:

错误用法:     select * from articles where body like ‘%mysql%’; 【不会使用到全文索引】

证明:   explain select * from articles where body like ‘%mysql%’

正确的用法是:     select * from articles where match(title,body) against(‘database’); 【可以】

知识点说明:

1. 在mysql中fulltext 索引只针对 myisam生效

2. mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文

3. 使用方法是 match(字段名..) against(‘关键字’)

4. 全文索引一个 叫 停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.

4、唯一索引

①当表的某列被指定为unique约束时,这列就是一个唯一索引

create table ddd(id int primary key auto_increment , name varchar(32) unique);

这时, name 列就是一个唯一索引.

unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复.

主键字段,不能为NULL,也不能重复.

②在创建表后,再去创建唯一索引

create table eee(id int primary key auto_increment, name varchar(32));

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

查询索引的方式:

1、desc 表名 【该方法的缺点是: 不能够显示索引名.】

2、show index(es) from 表名

3、show keys from 表名

删除索引的方式:

alter table 表名 drop index 索引名;

如果删除主键索引:  alter table 表名 drop primary key

修改索引的方式:

先删除,再重新创建.

原文地址:https://www.cnblogs.com/Typical-me/p/9536968.html

时间: 2024-10-18 07:12:25

mysql的几种索引的相关文章

【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则

MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度:如果是BLOB和TEXT类型,必须指定 length,下同. 修改表结构 ALTER mytable ADD INDEX

(2)mysql优化之使用索引优化查询

概述 ??索引是数据库优化中最常用的也是最重要的手段之一.该篇看看索引的分类,使用场景,不能使用的场景等. 索引分类 ??索引是在mysql存储引擎中实现的,而不是在服务器层实现的.索引每种存储引擎的索引不一定相同.mysql支持4种索引: B-tree索引:最常见索引,大部分引擎都支持B树索引. full-text索引:全文索引. hash索引:只有memory引擎支持. R-Tree索引:空间索引是myisam的一种特殊索引,使用比较少. 衍生索引:主键,唯一索引,组合索引,前缀索引等.ha

Mysql几种索引类型的区别及适用情况

如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE. 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持.其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR.VARCHAR ,TEXT 列上可以创建全文索引.值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTE

Mysql支持哪几种索引

从数据结构角度 1.B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理 2.hash索引:a 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询b 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引c 只有Memory存储引擎显示支持hash索引

什么是索引?Mysql目前主要的几种索引类型

一.索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车. 索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引.组合索引,即一个索引包含多个列. 创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件). 实际上,索引也是一张表,该表保存了主

图解MySQL索引(上)—MySQL有中“8种”索引?

关于MySQL索引相关的内容,一直是一个让人头疼的问题,尤其是对于初学者来说.笔者曾在很长一段时间内深陷其中,无法分清"覆盖索引,辅助索引,唯一索引,Hash索引,B-Tree索引--"到底是些什么东西,导致在面试过程中进入比较尴尬的局面. 很多人可能会抱怨"面试造火箭,工作拧螺丝,很多知识都是为了面试学的,工作中根本用不到!".庆幸的是,MySQL中索引不仅是面试必考知识,还是工作中用到最为频繁的必备技能,在笔者看来,索引是MySQL中性价比最高的一部分内容. 由

mysql 几种索引的复习(温故而知新)

explain执行计划包含的信息 type 访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL一般来说,好的sql查询至少达到range级别,最好能达到ref -- eq_ref

Mysql建表与索引使用规范详解

一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. 四. MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比. 五. MySQL使用时,一条SQL语句只能使用一个表的一个索引.所有的字段类型都可以索引,多列索引的属性最多15个. 六. 如果可以在多个索引中进行选择,My

MySql 自适应哈希索引

一.介绍 哈希(hash)是一种非常快的查找方法,一般情况下查找的时间复杂度为O(1).常用于连接(join)操作,如SQL Server和Oracle中的哈希连 接(hash join).但是SQL Server和Oracle等常见的数据库并不支持哈希索引(hash index).MySQL的Heap存储引擎默认的索引类型为哈希, 而InnoDB存储引擎提出了另一种实现方法,自适应哈希索引(adaptive hash index). InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈