ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL——索引 [打印本页]

作者: 乌市泽哥    时间: 6 天前
标题: MySQL——索引
一.索引的意义

索引:提高数据库的性能,索引不用加内存,不用改程序,不用调sql,只要执行正确的 create index ,查询速度就可能提高成百上千倍。
但是查询速度的提高是以插入、更新、删除的速度为代价的,这些写操纵,增长了大量的IO。所以它的代价,在于提高一个海量数据的检索速度。
常见索引分为:


二.MySQL与磁盘 

MySQL 中的数据文件,是以page为单元生存在磁盘当中的。
MySQL 的 CURD 操纵,都须要通过计算,找到对应的插入位置,大概找到对应要修改大概查询的数据。而只要涉及计算,就须要CPU参与,而为了便于CPU参与,一定要可以或许先将数据移动到内存当中。
所以在特定时间内,数据一定是磁盘中有,内存中也有。后续操纵完内存数据之后,以特定的革新 策略,革新到磁盘。而这时,就涉及到磁盘和内存的数据交互,也就是IO了。而此时IO的基本单元 就是Page
为了更好的进行上面的操纵, MySQL 服务器在内存中运行的时间,在服务器内部,就申请了被称 为 Buffer Pool 的的大内存空间,来进行各种缓存。其实就是很大的内存空间,来和磁盘数据进行IO交互。
为了更高的服从,一定要尽可能的减少系统和磁盘IO的次数
MySQL 中要管理很多数据表文件,而要管理好这些文件,就须要先形貌,在组织,可以简单理解成一个个独立文件是有一个大概多个Page构成的

差别的 Page ,在 MySQL 中,都是 16KB ,使用 prev 和 next 构成双向链表。
因为有主键的问题,MySQL 会默认按照主键给我们的数据进行排序,目的就是优化查询的服从。
在查询某条数据的时间直接将一整页的数据加载到内存中,以减少硬盘IO次数,从而提高性能。
 如果单个页中的数据量过大,则可以引入目次来资助索引数据。

如果页的数目过多,想要在这么多Page之间快速找到某一个Page并进而得到其数据,则须要再引入目次项,来资助索引到每个页。

目次页的本质也是页,平凡页中存的数据是用户数据,而目次页中存的数据是平凡页的地址。
可是就算是引入了目次项,也还是会有多个,须要去索引,此时,继续再添加目次页

这种结构,称为B+树,正是提高MySQL索引服从的内部数据结构。
Page分为目次页和数据页。目次页只放各个下级Page的最小键值。
查找的时间,自定向下找,只须要加载部分目次页到内存,即可完成算法的整个查找过程,大大减 少了IO次数。

三.索引操纵

1.创建主键索引

一个字段只要被设置为主键,就会默认拥有主键索引,所以我们只须要将对应的字段设为主键,便可实现索引,设置主键有三种方式:
   在创建表的时间,直接在字段名后指定 primary key
  create table user1(id int primary key, name varchar(30));
  在创建表的最后,指定某列或某几列为主键索引
  create table user2(id int, name varchar(30), primary key(id));
  创建表以后再添加主键
  create table user3(id int, name varchar(30));
  alter table user3 add primary key(id);
  主键索引的特点:


2.创建唯一键索引

唯一键索引与主键一样,只要被创建就可以或许索引,唯一键的创建方式也与主键一样有三种:
   在表定义时,在某列后直接指定unique唯一属性。
  create table user4(id int primary key, name varchar(30) unique);
  创建表时,在表的后面指定某列或某几列为unique
  create table user5(id int primary key, name varchar(30), unique(name));
  创建表以后再添加唯一键
  create table user6(id int primary key, name varchar(30);
  alter table user6 add unique(name);
  唯一索引的特点:


3.创建平凡索引 

平凡索引的创建须要通过 "index",同样有三种方式:
   create table user8(
  id int primary key, name varchar(20), email varchar(30),
  index(name) );--在表的定义最后,指定某列为索引
  create table user9(
  id int primary key, name varchar(20), email varchar(30));
  alter table user9 add index(name); --创建完表以后指定某列为平凡索引
  create table user10(
  id int primary key, name varchar(20), email varchar(30));
  create index idx_name on user10(name);-- 创建一个索引名为 idx_name 的索引
  平凡索引的特点:


 4.查询索引

查询索引有三种方法:
   show keys from 表名;
     show index from 表名;
       desc 表名;//消息比较简略
       其中第一种方法的效果如下:
 

5.删除索引

   第一种方法-删除主键索引:
  alter table 表名 drop primary key;
  第二种方法-其他索引(包括唯一键)的删除:
  alter table 表名 drop index 索引名;
  索引名就是show keys from 表名中的 Key_name 字段
  第三种方法方法: drop index 索引名 on 表名
  drop index name on user8;
  
 四.索引创建原则

比较频繁作为查询条件的字段应该创建索引。
唯一性太差的字段不得当单独创建索引,即使频繁作为查询条件。
更新非常频繁的字段不得看成创建索引。
不会出现在where子句中的字段不应创建索引。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4