加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.52wenzhou.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql优化概述2

发布时间:2021-01-08 07:28:30 所属栏目:MySql教程 来源:网络整理
导读:一、索引的概念利用关键字,就是记录的部分数据(某个字段,某些字段,某个字段的一部份),建立与记录位置的对应关系,就是索引。索引的关键字一定是排序的。二、索引的类型mysql支持四种索引:1、主键索引2、唯一索引3、普通索引4、全文索引无论任何形式的索

一、索引的概念
利用关键字,就是记录的部分数据(某个字段,某些字段,某个字段的一部份),建立与记录位置的对应关系,就是索引。索引的关键字一定是排序的。

二、索引的类型
mysql支持四种索引:
1、主键索引
2、唯一索引
3、普通索引
4、全文索引

无论任何形式的索引,都是通过建立关键字与位置的对应关系来实现的。
差异:对索引关键字的要求不同。
关键字:记录部分数据(某个字段,某些字段,某个字段的一部份)

普通索引(index):对关键字没有要求
唯一索引(unique index):要求关键字不能重复,同时增加唯一约束。
主键索引(primary key):要求关键字不能重复,同时不能为NULL。
全文索引(fulltext key):关键字的来源不是所有字段的数据,而是从字段中提取的特别关键字。

*如果一个索引通过在多个字段上提取的关键字,称之为复合索引。

三、索引的语法
创建: 1、创建表时创建索引 create table student ( id int unsigned not null auto_increment,name varchar(32) not null default '',nickname varchar(32) not null default '',sn char(12) not null default '',desc text,primary key (`id`),--主键索引 unique index `ui_sn` (`sn`),--唯一索引 index `name_nickname` (`name`,`nickname`),--复合索引 fulltext index `fi_desc` (`desc`) --全文索引 )engine=myisam charset=utf8; 索引可以起名字,主键索引不能起名字,一个表只能有一个主键索引,其它索引可以有多个。名字可以省略,mysql自动生成。 2、更新表结构时创建索引 alter table student add primary key (`id`); alter table student add unique index `ui_sn` (`sn`); alter table student add index `name_nickname` (`name`,`nickname`); alter table student add fulltext index `fi_desc` ('desc'); *如果表中存在数据,数据符合唯一或主键的约束才能创建成功。 *auto_increment属性,依赖于key。 删除: alter table student drop primary key; alter table student drop index `ui_sn`; alter table student drop index `name_nickname`; alter table student drop index `fi_desc`; 四、索引的使用 可以通过在select语句前使用explain,来获取该查询语句的执行计划。

mysql优化概述2 - 怀素真 - 因上努力 果上随缘

1、索引的使用场景
索引检索:条件过滤
索引排序:如果order by排序需要的字段上存在索引,可能使用到索引。
索引覆盖:索引拥有的关键字内容,覆盖了查询所需要的全部数据,此时就不需要数据区获取数据,仅仅在索引区中。

student表结构如下:

mysql优化概述2 - 怀素真 - 因上努力 果上随缘

如果我们要查询name,nickname,和sn这三个字段:

> select name,nickname,sn from student where name like 'a%';
通过分析我们可以在ename上建立索引来提高查询效率。

> alter table student add index `i_name` (`name`);

> explain select name,sn from student where name like 'a%'G;

mysql优化概述2 - 怀素真 - 因上努力 果上随缘

如上所示,查询确实用到了索引。
如果我们在name,nickname和sn上建立一个复合索引,结果会是怎么样?

> alter table student add index `i_nns` (`name`,`nickname`,`sn`);

mysql优化概述2 - 怀素真 - 因上努力 果上随缘

如上所示,只需要检索出索引中的所有数据即可。
 
五、索引使用的原则
索引存在,没有满足使用原则,导致索引无效。
1、列独立,如需要某个字段上使用索引,则字段在参与的表达式中,保证字段独立在一侧。

mysql优化概述2 - 怀素真 - 因上努力 果上随缘

如上所示,id+1=5 就不是独立列,所以没有使用索引。

2、左原则
LIKE:所匹配的关键字必须在左边,如果通配符出现在左边将不能使用索引。

mysql优化概述2 - 怀素真 - 因上努力 果上随缘

复合索引:仅仅针对左边字段有效果

mysql优化概述2 - 怀素真 - 因上努力 果上随缘

3、OR的原则
必须要保证两端的条件都存在可以使用的索引,才能使用到索引。

mysql优化概述2 - 怀素真 - 因上努力 果上随缘

4、mysql智能选择
即使满足了如上的原则,mysql也不一定会使用索引。
弃用索引的主要原因:查询即使使用索引,会导致出现大量的随机IO,相对于数据记录从第一条遍历到最后一条的顺序IO开销,还要大。

?

?

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读