数据库的索引

索引(Index)是帮助MySQL高效获取数据的数据结构,故索引的本质是数据结构。比如B树,B+树,Hash等

索引的分类

  • 主键索引(PRIMARY KEY)
    • 就是主键,需要符合实体完整性的所有条件。
  • 唯一索引(UNIQUE KEY)
    • 避免出现重复的列,但唯一索引可以重复(但主键是唯一的),意思就是可以有多个列标识为唯一索引。
  • 普通索引(KEY或INDEX)
    • 默认的索引,关键字为INDEX或KEY。
  • 全文索引(FULLTEXT)
    • 在特定的数据库引擎中才有,比如MyISAM,但现在InnoDB引擎也支持全文索引。
    • 快速定位数据。

测试索引

首先创建一个新的表app_user

CREATE TABLE `app_user` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(50) DEFAULT '' COMMENT '用户昵称',
    `email` varchar(50) NOT NULL COMMENT '用户邮箱',
    `phone` varchar(20) DEFAULT '' COMMENT '手机号',
    `gender` tinyint(4) unsigned DEFAULT '0' COMMENT '性别(0:男;1:女)',
    `password` varchar(100) NOT NULL COMMENT '密码',
    `age` tinyint(4) DEFAULT '0' COMMENT '年龄',
    `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `suoyin` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1000002 DEFAULT CHARSET=utf8 COMMENT='app用户表'

因为索引只有在数据比较多的情况下效果比较明显,所以利用过程化SQL编程向app_user表中插入1000000条数据,但用时可能会比较长

CREATE FUNCTION mock_data() RETURNS INT
DETERMINISTIC --因为我用的是navicat,我们创建函数时必须指定我们的函数是否是DETERMINISTIC 不确定的,NO SQL 没有 SQL 语句,当然也不会修改数据,READS SQL DATA 只是读取数据,当然也不会修改数据,MODIFIES SQL DATA 要修改数据,CONTAINS SQL 包含了 SQL 语句
BEGIN
    DECLARE counti INT DEFAULT 0;
	WHILE counti < 1000000 DO
	INSERT INTO app_user(`name`, email, phone, gender, `password`, age) VALUES(CONCAT('用户',counti), '[email protected]', CONCAT('138',FLOOR(RAND() * (99999999 - 10000000))), FLOOR(RAND() * 2), UUID(), FLOOR(RAND() * 100)) --电话,性别,密码和年龄都是随机的
	SET counti = counti + 1;
	END WHILE;
	RETURN counti;
END;

插入完成后,随即查找一条数据

SELECT * FROM app_user WHERE `name` = '用户837820'; 
--运行了三次,时间分别为Time: 2.278000s, Time: 0.641000s, Time: 0.644000s

也可以利用EXPLAIN看查找的具体信息

EXPLAIN SELECT * FROM app_user WHERE `name` = '用户837820'; 

可以看到花费的时间和查找的行数都很多。

在`name`字段上建立索引

ALTER TABLE app_user ADD INDEX suoyin (`name`);

CREATE INDEX suoyin ON app_user(`name`);

 同样的查询所花费的时间分别为Time: 0.011000s,Time: 0.000000s,Time: 0.001000s。耗时大大降低。

从EXPLAIN后可以看到建立索引后只查找了一行就找到了数据

 也可以利用

SHOW INDEX FROM app_user;

查找表中所有索引的信息。

索引原则

  1. 索引不是越多越好,系统维护索引和查找索引也需要付出代价。
  2. 经常进行更新操作的表(关系)上索引数不能太多,不然更新表里的数据时,索引也需要跟着修改。
  3. 小数据量的表不需要建立索引。
  4. 在经常进行查询操作的表上建立索引。

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