一、數據結構設計
?正確的數據結構設計對數據庫的性能是非常重要的。 在設計數據表時,盡量遵循一下幾點:
- 將數據分解為合適的表,每個表都應該有清晰定義的目的,避免將過多的數據存儲在單個表中。
- 使用適當的數據類型來存儲數據,避免使用過大或不必要的數據類型,以節省空間并提高讀寫效率。
- 避免使用過多的NULL值,盡量設計出不含NULL值的表結構,有助于節省存儲空間并提高查詢效率。
1.1 創建數據表示例
用戶數據表
create table users (id int auto_increment primary key,username varchar(50) not null,email varchar(100) not null,balance int,created_at timestamp default current_timestamp
);
二、索引的使用
2.1 什么是索引
首先我們要了解什么是索引、它是干嘛?
索引是一種用于提高數據庫查詢性能的數據結構。你可以把它想象成一本書的目錄,可以提高查詢的速度。也就是說,當你在表的列上創建索引時,數據庫會根據這些列的數值快速定位到具體的行,不需要整表的掃描。
2.2 常見的索引類型
- 普通索引:不要求被索引的列的值是唯一的。
- 唯一索引:要求被索引的列的值是唯一的。
- 主鍵索引:要求被索引的列的值是唯一的,且不允許為空。
- 全文索引:在本文數據中進行全文搜索, 比如在某一段文章中查找出特定的關鍵字。
在使用索引時,盡量遵循這幾點:
- 根據實際需求創建合適的索引,通常對經常用于查詢條件的列進行索引。
- 避免在過多的列上使用索引,這會增加寫操作的開銷,還會占用額外的存儲空間。
- 定期檢查刪除不再使用的索引。
2.3 索引示例?
添加索引
create index idx_username on users (username);
三、增加查詢語句效率
我們在編寫查詢語句時,盡量遵循以下幾點:
- 盡量不去使用?select * ,而是明確列出需要的字段,避免讀取不必要的數據。
- 謹慎使用子查詢,盡量優化為連接查詢以及其他方式。
- 合理使用join,多表連接可能會引發性能為題,使用合適的連接類型來優化查詢效率。
3.1 優化查詢示例?
優化查詢語句
select id, username from users where username = 'zhangsan' limit 1;
四、正確使用事務
4.1 什么是事務?
它是一組sql查詢的集合,這些查詢要么全部成功執行,要么全部失敗回滾。事務可以確保數據的完整性和唯一性。
4.2 事務的特性
事務具有以下特性:
- 原子性:事務中所有操作要么全部成功執行,要么全部失敗回滾。
- 一致性:事務開始之前和結束之后,數據庫的完整性約束沒有被破壞,數據始終保持一致狀態。
- 隔離性:多個事物并發執行時,每個事物都應當與其他事物相互隔離。
- 持久性:一旦事務進行提交,它所做的修改會永久的保存在數據庫中。
事務的使用盡量遵循一點:
合理設置事務的范圍,避免事務持有鎖時間過長導致性能問題。
4.3 事務的示例
使用事務
start transaction; 開始一個事務,后續sql將視為一個整體,要么全部執行,要么全部失敗。
commit; 提交事務,如果前面的所有操作都執行成功,那這些操作都將保存到數據庫中。
start transaction;
insert into orders (user_id, total_amount) values (1, 100);
update users set balance = balance - 100 where id = 1;
commit;
五、分區表
5.1 什么是分區表
通過對數據表進行分區,可以提高查詢性能。
也就是說當我們有一個很龐大的數據進行處理時,通過分區表可以減少查詢所需的數據量,減緩查詢時間。
創建分區表盡量遵循一點:
- 根據數據的時間范圍進行分區,可以加快查詢速度,針對歷史性數據的查詢。
5.2 分區表示例
創建分區表
partition by range (year(log_time)) 表示按照log_time字段進行分區。
partition p0 values less than(2022) 表示創建一個名為p0的分區,用于存儲log_time 小于2022的數據。
create table logs (id int auto_increment,log_time timestamp,message text,primary key(id, log_time)
) partition by range (year(log_time)) (partition p0 values less than (2022),partition p1 values less than (2023),partition p2 values less than (2024)
);