diff --git "a/\345\256\213\345\230\211\350\261\252/20241018 \347\264\242\345\274\225\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" "b/\345\256\213\345\230\211\350\261\252/20241018 \347\264\242\345\274\225\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..d9b6f00faccf79320cf029a46e2e400fd8c0a288 --- /dev/null +++ "b/\345\256\213\345\230\211\350\261\252/20241018 \347\264\242\345\274\225\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" @@ -0,0 +1,87 @@ +```sql +-- 练习和作业 +-- 1. 给emp表分别建立 普通索引和唯一索引 +-- 创建普通索引,假设我们对job字段创建普通索引 +CREATE INDEX idx_job ON emp(job); + +-- 创建唯一索引,假设我们对ename字段创建唯一索引 +CREATE UNIQUE INDEX idx_ename ON emp(ename); +-- 2. 查询emp表有哪些索引 +SHOW INDEXES FROM emp; +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +-- 使用索引字段进行查询 +SELECT * FROM emp WHERE job = '销售员'; + +-- 查看语句是否使用到了索引(这通常需要通过EXPLAIN关键字来查看执行计划) +EXPLAIN SELECT * FROM emp WHERE job = '销售员'; +-- 4. 删除前面建立的两个索引 +-- 删除普通索引 +DROP INDEX idx_job ON emp; + +-- 删除唯一索引 +DROP INDEX idx_ename ON emp; +-- 5. 选择两个字段添加一个复合索引 +-- 创建一个复合索引,假设我们对deptno和sal字段创建复合索引 +CREATE INDEX idx_deptno_sal ON emp(deptno, sal); +-- 6. 使用复合索引的字段进行查询 +-- 使用复合索引字段进行查询 +SELECT * FROM emp WHERE deptno = 20 AND sal BETWEEN 7000 AND 12000; + +-- 同样,你可以使用EXPLAIN来查看这条语句是否使用了索引 +EXPLAIN SELECT * FROM emp WHERE deptno = 20 AND sal BETWEEN 7000 AND 12000; +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + uname VARCHAR(255), + age INT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +DELIMITER $$ + +CREATE PROCEDURE GenerateRandomData() +BEGIN + DECLARE i INT DEFAULT 0; + WHILE i < 5000000 DO + INSERT INTO users (uname, age) VALUES (CONCAT('User_', FLOOR(1 + (RAND() * 999999))), FLOOR(1 + (RAND() * 100))); + SET i = i + 1; + END WHILE; +END $$ + +DELIMITER ; + +CALL GenerateRandomData(); + +DROP PROCEDURE GenerateRandomData; +-- 1. 不用索引查询 一次姓名uname 并记录时间 +-- 记录开始时间 +SET @start_time = CURRENT_TIMESTAMP; + +-- 查询用户名为'User_1'的用户,不使用索引 +SELECT * FROM users WHERE uname = 'User_1'; + +-- 记录结束时间 +SET @end_time = CURRENT_TIMESTAMP; + +-- 计算查询耗时 +SELECT TIMESTAMPDIFF(SECOND, @start_time, @end_time) AS duration_seconds; +-- 2. 建立索引查询 一次姓名uname 并记录时间 +CREATE INDEX idx_uname ON users(uname); + +-- 记录开始时间 +SET @start_time = CURRENT_TIMESTAMP; + +-- 查询用户名为'User_1'的用户,此时使用索引 +SELECT * FROM users WHERE uname = 'User_1'; + +-- 记录结束时间 +SET @end_time = CURRENT_TIMESTAMP; + +-- 计算查询耗时 +SELECT TIMESTAMPDIFF(SECOND, @start_time, @end_time) AS duration_seconds; + +``` + + +