MySQL查詢性能優化

1、是否查詢了不須要的數據緩存

1.多使用limit來分頁函數

2.不要用select *,特別是在多表關聯的時候性能

3.避免重複查詢相同的數據,能夠多使用緩存優化

 

2、正確使用索引編碼

如何正確使用索引見上一篇文章《MySQL索引》,這裏再補充幾個索引失效的案例:spa

key(last_name, first_name, dob)blog

1.select * from blog_user where last_name like '%A%'; //使用like時通配符在前索引

2.select * from blog_user where last_name is null; //is null或is not null會放棄使用索引事務

3.select * from blog_user where UPPER(last_name) like 'A%'; //對索引列作了函數計算ci

4.select * from blog_user where last_name like 'A%' or first_name = 'b'; //使用or會致使索引失效,除非or的左右兩邊都分別正確使用索引。如select * from blog_user where last_name like 'A%' or last_name = 'b';

5.隱式類型轉換

6.隱式字符編碼轉換

建立blog_name表:

CREATE TABLE `blog_name` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `last_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

  `first_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,

  PRIMARY KEY (`id`),

  KEY `last_name` (`last_name`),

  KEY `first_name` (`first_name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

7.MySQL選錯索引

先向blog_name插入10萬條數據:

delimiter ;;

create procedure Adata()

begin

  declare i int;

  set i=1;

  while(i<=100000)do

    insert into blog_name values(null, i, i);

    set i=i+1;

  end while;

end;;

delimiter ;

call Adata();

這裏雖然有索引可是卻沒有使用索引而是走的全表掃描,由於MySQL優化器認爲直接掃描主鍵索引更快,若是使用索引last_name,每次從索引last_name上拿到一個值,都要返回主鍵索引查出整行數據,這個代價優化器也要算進去。而若是全表掃描,是直接在主鍵索引上掃描的,沒有額外代價。這種狀況能夠經過force index來指定使用索引,從而避免索引失效。(若是指定使用索引更快的話)

 

3、減小鎖爭用

1.避免大事務

2.避免一次操做太多行

如delete from logs limit 10000;能夠作出以下優化:

for (i = 0; i < 20; i++) {

delete from logs limit 500;

}

 

參考資料:《高性能MySQL第三版》、《MySQL實戰45講》

相關文章
相關標籤/搜索