diff --git "a/\345\210\230\345\277\227\345\274\272/20240908 RBAC\345\255\246\346\240\241\347\256\241\347\220\206\347\263\273\347\273\237\351\234\200\346\261\202/20241020 \347\264\242\345\274\225/\347\264\242\345\274\225.md" "b/\345\210\230\345\277\227\345\274\272/20240908 RBAC\345\255\246\346\240\241\347\256\241\347\220\206\347\263\273\347\273\237\351\234\200\346\261\202/20241020 \347\264\242\345\274\225/\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..898d708b812a15bdd42cfd00f1350e42285f3341 --- /dev/null +++ "b/\345\210\230\345\277\227\345\274\272/20240908 RBAC\345\255\246\346\240\241\347\256\241\347\220\206\347\263\273\347\273\237\351\234\200\346\261\202/20241020 \347\264\242\345\274\225/\347\264\242\345\274\225.md" @@ -0,0 +1,139 @@ +# 笔记 -- 索引 + +### 1. **索引的概念** + +- **定义**:索引是数据库表中一个特殊的数据结构,用于快速查找和访问表中的数据。它类似于书籍的目录。 +- **作用**:加速数据检索,优化查询性能,避免全表扫描。 + +### 2. **索引的类型** + +- **单列索引**:只包含单个列的索引。 +- **复合索引**:由多个列组成的索引,用于加速涉及多个列的查询。 +- **唯一索引**:确保索引列中的值是唯一的,不允许重复。 +- **主键索引**:一种特殊的唯一索引,且不允许为空,通常用于唯一标识一行数据。 +- **全文索引**:用于对文本数据进行全文检索,主要用于查找大文本字段中的关键词。 +- **空间索引**:用于地理数据类型的索引,加速空间查询。 + +### 3. **创建索引** + +使用 `CREATE INDEX` 语句可以创建索引: + +``` +CREATE INDEX index_name ON table_name(column1, column2, ...); +``` + +- **示例**: + +``` +CREATE INDEX idx_name ON employees(last_name); +# 其它方法 +alter table table_name add index idx (xx); +alter table table_c add index idx_c (uname); +-- 建表时 +create table table_b( +id int PRIMARY key auto_increment, +uname varchar(10), +index idx_b (uname) +); +``` + +### 4. **索引的使用** + +- **自动创建索引**:在创建主键、唯一约束、外键等时,MySQL会自动创建索引。 +- **查询优化**:使用索引可以加速`SELECT`语句,特别是在`WHERE`、`ORDER BY`、`JOIN`等操作中。 + +### 5. **索引的选择** + +- **选择性**:索引的选择性越高,索引的效果越好。选择性是指索引中唯一值的比例。 +- **列的数据类型**:对于高选择性列(如身份证号、电子邮件等)创建索引更有效。 +- **避免高重复的列**:比如性别列 + +### 6. **索引的优缺点** + +- **优点**: + - 提高查询速度。 + - 减少查询所需的IO操作。 +- **缺点**: + - 增加写入操作的时间(INSERT、UPDATE、DELETE),因为需要维护索引。 + - 增加存储空间的使用。 + +### 7. **查看索引** + +使用 `SHOW INDEX FROM table_name;` 可以查看表中的索引信息。 + +### 8. **删除索引** + +使用 `DROP INDEX` 语句删除索引: + +``` +DROP INDEX index_name ON table_name; +-- 其它 +alter table table_a drop index idx_a; +``` + +- **示例**: + +``` +DROP INDEX idx_name ON employees; +``` + +### 9. **使用场景** + +- 在需要频繁查询的列上创建索引。 +- 对于大表的经常使用的查询,尤其是涉及到排序和过滤的查询。 + +### 11. **性能监控** + +使用 `EXPLAIN` 语句可以查看查询的执行计划,分析索引的使用情况: + +``` +EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; +``` + +复合索引(联合索引),使用要遵循最左原则:即在复合索引中,做条件查询的字段必须包含最左边的列名。 + +1. 给emp分别建立 普通索引和唯一索引 + + ``` + -- 普通索引 + CREATE INDEX emp_normal ON emp(empno,ename); + -- 唯一索引 + CREATE UNIQUE INDEX emp_unique ON emp(empno,ename); + ``` + +2. 查询emp表有哪些索引 + + ``` + SHOW INDEX FROM emp; + ``` + +3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 + + ``` + EXPLAIN SELECT empno FROM emp; + ``` + +4. 删除前面建立的两个索引 + + ``` + DROP INDEX emp_normal ON emp; + DROP INDEX emp_unique ON emp; + ``` + +5. 选择两个字段添加一个复合索引 + + ``` + CREATE INDEX emp_add ON emp(ename,job); + ``` + +6. 使用复合索引的字段进行查询 + +``` +SELECT * FROM emp WHERE ename='黛绮丝' AND job='销售员'; +``` + +1. 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 + +不用索引查询 一次姓名uname /并记录时间 + +建立索引查询 一次姓名uname /并记录时间 \ No newline at end of file