测试百万数据下索引的优势

1.在数据库中创建一个测试表

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`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT = 'app用户表'

2.创建函数,生成百万条随机数据

-- 插入100万数据.
DELIMITER $$
-- 写函数之前必须要写,这是标志
CREATE FUNCTION rand_data ()
RETURNS INT
BEGIN
	DECLARE num INT DEFAULT 1000000;
	DECLARE i INT DEFAULT 0;
--循环执行1000000次
	WHILE i 
  

3.这时候出现了报错

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de

这是我们开启了bin-log, 我们就必须指定我们的函数是否是

1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

解决方法:

set global log_bin_trust_function_creators=TRUE;

4.执行成功,生成1000000条数据

测试百万数据下索引的优势_第1张图片

5.这个时候我们在没有设置索引的情况下进行查询、

SELECT * FROM app_user WHERE NAME='用户10086';

6.查询成功,可以看到耗时0.623S(我用的是十代i5)

测试百万数据下索引的优势_第2张图片

7.可以在select语句前加上explain语句分析,可以看到rows列的数值是992659;这个表示的是遍历了多少行

8.加上索引

CREATE INDEX id_app_user_name ON app_user(`name`);

//删除索引
DROP INDEX id_app_user_name ON app_user;

9.再次查询

测试百万数据下索引的优势_第3张图片

可以看到耗时是非常低的

10.总结

典型的用空间换时间(索引是占用内存的)

可以类比一页一页翻书找资料,和根据目录找资料的速度

索引在数据量很大(百万以上)的时候才有明显优势

索引的原则

索引不是越多越好(占空间)

不要对进程变动加索引(更改已经创建索引的内容会降低效率)

小数据量不要加索引(没什么用,且占空间)

索引一般用在常常查询的字段上

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