10 MySQL索引选择与使用

索引概述

每种存储引擎对每个表至少支持16个索引,总索引长度至少256字节.

MyISAM和InnoDB的表默认创建BTREE索引.MEMORY引擎默认使用HASH索引,但也支持BTREE

MySQL目前不支持函数索引,但支持前缀索引.

MyISAM支持的前缀索引最大长度为1000字节;InnoDB支持的前缀索引最大程度是767字节.

CREATE TABLE 创建索引时是按照字符数计量的,所以对于多字节的字符集,要考虑字符和字节的关系.

MySQL还支持FULLTEXT(全文本)索引,用于全文搜索.5.0版本目前只有MyISAM存储引擎支持FULLTEXT索引,且只限于CHAR,VARCHAR,TEXT类型的数据列.

索引总是对整个行进行的,不支持局部(前缀)索引.

创建索引的语法:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

[USING index_type]

ON tbl_name (index_col_name,...) ;

也可以使用ALTER TABLE 语法增加索引.

ALTER TABLE tbl_name ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX idx_name index_col_name ;

index_col_name :

col_name[(length)] [ASC|DESC]

删除索引的语法

DROP INDEX index_name ON tbl_name ;

索引设计原则:

1).搜索的索引列:

是指出现在WHERE字句中的列,或连接子句中指定的列;而不是SELECT关键字后的列.

2).使用唯一索引:

索引的列的基数越大,索引效果越好.比如存放生日的列具有不同值,可以区分出各行;而存放性别的列,只有‘F‘或‘M‘ , 搜索出来的基本五五开,索引的意义就不大.

3).使用短索引:

如果对字符串进行索引,应该指定一个前缀长度.例如有个CHAR(200)的列,如果在前10-20个字符内,多数值是唯一的,那就不要对整个列进行索引.这样磁盘I/O操作更少,缓存中的块能容纳更多的键值对.

4).利用左前缀: -- todo 这tm解释,作者你自己能看懂嘛?

在创建一个n列的索引时,实际是创建了MySQL可利用的n个索引.多列索引可起到多个索引的作用,因为可利用索引中最左边的列集来匹配行.这样的列集被称为最左前缀.

5).不要过度使用索引,

过犹不及.多了,或者很多不需要的索引会导致磁盘IO.修改表也会对索引进行更新甚至重构.也会给查询优化带来更多的工作.也会导致MySQL在查询时使用不到最好的那个索引.

6).对于InnoDB存储引擎的表

记录的保存顺序:

有明确主键,按照主键顺序;

没有主键但有唯一索引列,按索引列顺序;

没有唯一索引,MySQL生成内部列,按照内部列排序;

使用主键/内部列进行访问是最快的.所以InnoDB表尽量显示指定主键.

如果同时有几列都是唯一的,都可以作为主键,选择比较短的数据类型.可以减少磁盘IO,以及提高索引效果.

BTREE索引与HASH索引

HASH索引:

只用于使用 = , <=> 这种操作符进行等式比较.

优化器不能使用HASH索引来加速ORDER BY 操作.

MySQL不能确定在两个值之间大概有多少数据行.如果将MyISAM表改为HASH索引的MEMORY表,会影响一些查询的执行效率.

只能使用整个关键字来搜索一行.

BTREE索引:

当是一哦那个>,<,>=,<=,BETWEEN,!=,<> 或者LIKE ‘pattern‘(其中pattern不以*开头) , 都可以使用相关列上的索引.

范围查询时,HASH索引,其实还是扫描的全盘,而BTREE则是范围搜索.

可以使用 EXPLAIN 语句来观察.如 : explain SELECT * FROM tbl_name WHERE .... ;

原文地址:https://www.cnblogs.com/lmxxlm-123/p/11131965.html

时间: 2024-10-09 15:11:12

10 MySQL索引选择与使用的相关文章

单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式 一 表结构如下:  MySQL  5.5.30  5.6.20 版本, 表大概有815万行 CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10) unsigned NOT NULL DEFAULT '0',  Fuser varchar(50) DEFAULT '',  Fip bigint

七、mysql索引选择

1.myisam,bdb,innodb,memory 单表至少支持16个索引 2.create index id_index on emp (id) 为emp表创建一个名为id_index的id字段的索引 3.drop index id_index on emp 删除emp表的id_index 索引 4.explain xxxxxxx,可以查看相关的执行结果,用于优化表用 5.最合适的索引列是“条件列”,而不是“选择列” 比如 select name from emp where year >=

单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

一 表结构如下:  MySQL  5.5.30  5.6.20 版本, 表大概有815万行 CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10) unsigned NOT NULL DEFAULT '0',  Fuser varchar(50) DEFAULT '',  Fip bigint(16) DEFAULT NULL,  Foperate_object_id big

MySQL索引选择及添加原则

索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FROM table_name 一般来说(例如书 "SQL Tuning"),如果选择性超过 20% 那么全表扫描比使用索引性能更优. 但MySQL是没有计算索引的选择性的,只是预测逻辑IO操作的数量,因此对于MySQL索引要慎重选择. 索引几大原则: 1.选择唯一性索引 唯一性索引的值是唯一的

10.Mysql索引

10.索引的设计和使用10.1 索引概述BTREE索引:Mysql(MyIASM和Innodb)默认的索引类型.前缀索引:对索引字段的前N个字符创建索引.N的最大取值和存储引擎有关,MyIASM支持最大前缀长度为1000字节,Innodb引擎支持最大前缀长度为767字节.全文索引:可用于全文搜索.仅有MyIASM支持全文索引,且只限于CHAR.VARCHAR.Text类型的列.空间类型索引:仅有MyIASM支持空间类型索引,索引列必须为非空.HASH索引:仅有MEMORY支持HASH索引.创建索

MySQL索引选择及规则整理

索引选择性 索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FROM table_name 一般来说(例如书 “SQL Tuning“),如果选择性超过 20% 那么全表扫描比使用索引性能更优. 但MySQL是没有计算索引的选择性的,只是预测逻辑IO操作的数量,因此对于MySQL索引要慎重选择. 举个栗子,tinyint类型的列,用以保存性别,就算用上

第10章 mysql 索引

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] 理解MySQL——索引与优化 [6] mysql索引总结----mysql 索引

MySQL索引那些事

原文链接 大家有没有遇到过慢查询的情况,执行一条SQL需要几秒,甚至十几.几十秒的时间,这时候DBA就会建议你去把查询的 SQL 优化一下,怎么优化?你能想到的就是加索引吧? 为什么加索引就查的快了?这就要从索引的本质以及他的底层原理说起. 索引是什么 那索引到底是什么呢?你是不是还停留在大学学『数据库原理』时老师讲的“索引就像字典的目录”这样的概念?老师讲的没错,但没有深入去讲. 其实索引就是一种用于快速查找数据的数据结构,是帮助MySQL高效获取数据的排好序的数据结构. 索引的好处 举例说明

MySQL如何选择合适的索引

先来看一个栗子 EXPLAIN select * from employees where name > 'a'; 如果用name索引查找数据需要遍历name字段联合索引树,然后根据遍历出来的主键值去主键索引树里再去查出最终数据,成本比全表扫描还高. 可以用覆盖索引优化,这样只需要遍历name字段的联合索引树就可以拿到所有的结果. EXPLAIN select name,age,position from employees where name > 'a'; 可以看到通过select出的字段