MySQL 索引

MySQL 索引与事物
数据库索引索

文章目录

  • MySQL 索引与事物
    数据库索引索
  • 1.索引的概念
  • 2.索引的作用
  • 3.索引分类
    • 3.1普通索引
    • 3.2唯一性索引
    • 3.4主键索引
    • 3.5组合索引(单列索引与多列索引)
    • 3.6 全文索引
      • (1)创建表的全文索引
      • (2)修改表结构添加全文索引
      • (3)直接创建索引
    • 3.7 删除索引
    • 3.8 查看索引
    • 3.9 创建索引的原则依据 数据库建立索引的原则:

mysql的数据类型和字段属性
索引拓展

1.索引的概念

是一个排序的列表,存储着索引值和这个值所对应的物理地址无须对整个表进行扫描,通过物理地址就可以找到所需数据是表中一列或者若干列值排序的方法需要额外的磁盘空间。

2.索引的作用

数据库利用各种快速定位技术,能够大大加快查询速率当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度可以降低数据库的IO成本,并且还可以降低数据库的排序成本通过创建唯一性索引保证数据表数据的唯一性可以加快表与表之间的连接在使用分组和排序时,可大大减少分组和排序时间。

3.索引分类

3.1普通索引

  • 最基本的索引类型,没有唯一性之类的限制
  • 创建普通索引的方式

##############格式#######################

CREATE INDEX index_name ON table_name(length);  //length是表中的某个筛选某个列

mysql> create index index_tmp on info(name);  //info 原表,index_tmp 是索引名
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

##############  查看索引表  #######################

mysql> show index from info\G;  //查看索引表
*************************** row ***************************
        Table: info
   Non_unique: 1
     Key_name: index_tmp
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
3 rows in set (0.00 sec)

##############  删除索引表  #######################

mysql> drop index index_tmp on info;     //删除索引表,index_tmp 是索引表,info是原表
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 


3.2唯一性索引

与“普通索引”基本相同
与普通索引的区别是索引列的所有值只能出现一次,即必须唯一
创建唯一索引的方式

方法一 unique


##############  格式  #######################

 create unique index unique_name ON table_name(length);  
##############  案例  #######################

mysql> create unique index unique_tmp on info(name);  //info 原表,unique_tmp唯一索引表
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0



方法二 alter

##############  格式  #######################

alter table table_name ADD unique unique_name (length);

############## 案例 #######################
mysql> alter table info add unique unique_tmp(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 


3.4主键索引

  • 是一种特殊的唯一索引,指定为“PRIMARY KEY”
  • 一个表只能有一个主键,不允许有空值
  • 创建主键索引的方式
##############  格式  #######################
CREATE TABLE table_name (
   id int(11) NOT NULL AUTO_INCREMENT ,
    title char(255) NOT NULL ,
    PRIMARY KEY (id)
);

##############  案例  #######################
mysql> create table info01(
    -> id int(11) not null auto_increment,
    -> title char(255) not null,
    -> primary key (id)
    -> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc info01;  //查看表结构
+-------+-----------+------+-----+---------+----------------+
| Field | Type      | Null | Key | Default | Extra          |
+-------+-----------+------+-----+---------+----------------+
| id    | int(11)   | NO   | PRI | NULL    | auto_increment |
| title | char(255) | NO   |     | NULL    |                |
+-------+-----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> 

3.5组合索引(单列索引与多列索引)

  • 可以是单列上创建的索引,也可以是在多列上创建的索引
  • 最左原则,从左往右依次执行
  • 创建组合索引的方式

CREATE TABLE user(
    name varchar(9),
    age int(3),
    sex tinyint(1),
    INDEX user(name, age, sex)
);


3.6 全文索引

  • MySQL从3.23.23版开始支持全文索引和全文检索
  • 索引类型为fulltext
  • 可以在char、varchar或者TEXT类型的列上创建

(1)创建表的全文索引

mysql> create table user03(
    -> id int(11) not null auto_increment,
    -> title char(255) character set utf8 collate utf8_general_ci not null,
    -> content text character set utf8 collate utf8_general_ci null,
    -> time int(10) null default null,
    -> primary key(id),fulltext(content)
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> desc user03;
+---------+-----------+------+-----+---------+----------------+
| Field   | Type      | Null | Key | Default | Extra          |
+---------+-----------+------+-----+---------+----------------+
| id      | int(11)   | NO   | PRI | NULL    | auto_increment |
| title   | char(255) | NO   |     | NULL    |                |
| content | text      | YES  | MUL | NULL    |                |
| time    | int(10)   | YES  |     | NULL    |                |
+---------+-----------+------+-----+---------+----------------+
4 rows in set (0.00 sec)


(2)修改表结构添加全文索引


mysql> alter table info add fulltext index_content(name);   //info原表,index_content 是新建全文索引表
Query OK, 0 rows affected (0.27 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from info\G;   //查看全文索引表

***************************  row ***************************
        Table: info
   Non_unique: 1
     Key_name: index_content
 Seq_in_index: 1
  Column_name: name
    Collation: NULL
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
3 rows in set (0.00 sec)

ERROR: 
No query specified

mysql> 

(3)直接创建索引


mysql> create fulltext index index_content on info(name);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from info\G;

***************************  row ***************************
        Table: info
   Non_unique: 1
     Key_name: index_content
 Seq_in_index: 1
  Column_name: name
    Collation: NULL
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
3 rows in set (0.00 sec)

ERROR: 
No query specified

mysql> 

3.7 删除索引

  • drop index 索引名 ON 表名;
  • alter table 表名 drop index 索引名;

mysql> drop index index_tmp on info;     //删除索引表,index_tmp 是索引表,info是原表
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 


mysql>drop index index_puid on mapping;
Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 


mysql>alter table mapping drop index gameid;
Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0


3.8 查看索引

mysql>show index from tablename;

mysql>show keys from tablename;

3.9 创建索引的原则依据 数据库建立索引的原则:

  1. 确定针对该表的操作是大量的查询操作还是大量的增删改操作;
  2. 尝试建立索引来帮助特定的查询。检查自己的 sql 语句,为那些频繁在 where 子句中出 现的字段建立索引;
  3. 尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长时间,同时复合索 引也占磁盘空间;
  4. 对于小型的表,建立索引可能会影响性能;
  5. 应该避免对具有较少值的字段进行索引;
  6. 避免选择大型数据类型的列作为索引。
  7. 表的主键、外键必须有索引
  8. 记录数超过300行的表应该有索引
  9. 经常与其他表进行连接的表,在连接字段上应该建立索引
  10. 唯一性太差的字段不适合建立索引
  11. 更新太频繁地字段不适合创建索引

索引建立的原则: 索引查询是数据库中重要的记录查询方法,要不要建立索引以及在那些字段上建立索引 都要和实际数据库系统的查
询要求结合来考虑,下面给出实际生产环境中的一些通用的原 则:

  • 在经常用作过滤器的字段上建立索引;
  • 在 SQL 语句中经常进行 GROUP BY、ORDER BY 的字段上建立索引;
  • 在不同值较少的字段上不必要建立索引,如性别字段;
  • 对于经常存取的列避免建立索引;
  • 用于联接的列(主健/外健)上建立索引;
  • 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度 来确定;
  • 缺省情况下建立的是非簇集索引,但在以下情况下最好考虑簇集索引,如:含有限数目
    (不是很少)唯一的列;进行大范围的查询;充分的利用索引可以减少表扫描 I/0 的次
    数,有效的避免对整表的搜索。当然合理的索引要建立在对各种查询的分析和预测中, 也取决于 DBA 所设计的数据库结构。

你可能感兴趣的:(数据库)