遇上数据瓶颈,你还敢不建索引揭秘MySQL不建索引的25个坏处(mysql不建索引坏处)
遇上数据瓶颈,你还敢不建索引?——揭秘MySQL不建索引的25个坏处
在MySQL中,索引是一种用于查找数据的数据结构,可以提高查询速度,降低系统的负载。然而,许多开发者并不重视索引的建立,在数据量较小的情况下可能并不会对性能造成太大影响。但是,随着数据量的不断增大,没有索引的表将会变得越来越糟糕,从而导致性能瓶颈和其他问题。
以下是25个不建立索引的问题:
1.查询速度慢
2.增加服务器负载
3.表占用更多的磁盘空间
4.更多的磁盘I/O操作
5.缩短可用磁盘寿命
6.会导致内存交换
7.会导致文件缓存命中率下降
8.会带来锁竞争问题
9.占用更多的TCP/IP连接
10.占用更多的CPU时间
11.占用更多的内存
12.可能导致数据意外崩溃
13.可能导致数据丢失
14.可能导致查询结果错误
15.可能导致数据被篡改
16.会导致更新操作变慢
17.会导致插入操作变慢
18.会导致删除操作变慢
19.可能导致锁定表
20.可能导致长时间等待锁
21.可能导致键冲突
22.可能导致事务失败
23.可能导致严重的数据库损坏
24.可能导致系统崩溃
25.可能导致恶意攻击
以上的问题是非常严重的。如果MySQL数据库没有索引或者索引使用不当,我们将会遇到各种各样的问题,并可能难以恢复。
下面实际操作演练:
我们创建一个简单的表:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900__ci;
然后,我们将向表中插入一些数据:
INSERT INTO `test` (`name`) VALUES
(‘张三’),
(‘李四’),
(‘王五’),
(‘赵六’),
(‘田七’),
(‘秦八’),
(‘周九’);
现在,我们来查询表中的数据:
SELECT * FROM `test` WHERE `name` = ‘张三’;
我们可以看到,查询非常快,并且没有任何问题。
但是,如果我们将表中的数据扩大到100万行:
DELIMITER ;;
CREATE PROCEDURE seed_fake_data()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i
INSERT INTO `test` (`name`) VALUES (CONCAT(‘User ‘, i));
SET i = i + 1;
END WHILE;
END;;
DELIMITER ;
CALL seed_fake_data();
现在,我们再次运行相同的查询:
SELECT * FROM `test` WHERE `name` = ‘User 1’;
查询速度非常慢,并且花费了数秒的时间才能返回结果。这是由于表中没有建立索引,导致数据的扫描速度非常慢。因此,在实际的应用程序中,我们应该非常注意表的索引建立,以避免性能瓶颈。