Công ty thiết kế website chuẩn SEO Web Mới
Tìm kiếm
Công ty thiết kế website chuẩn SEO Web Mới

INDEX (chỉ mục) trong MySQL

INDEX (chỉ mục) trong MySQL được sử dụng để INDEX (chỉ mục) cho 1 cột hoặc nhiều cột nhằm giúp cho khi bạn WHERE dữ liệu sẽ truy vấn nhanh hơn, chi tiết như nào hãy cùng chúng tôi phân tích:

INDEX (chỉ mục) trong MySQL

INDEX (chỉ mục) trong MySQL

Chức năng của INDEX (chỉ mục) trong MySQL

INDEX (chỉ mục) trong MySQL được sử dụng để INDEX (chỉ mục) cho 1 cột hoặc nhiều cột nhằm giúp cho khi bạn WHERE dữ liệu sẽ truy vấn nhanh hơn.

Kiểm tra truy vấn khi bảng chưa INDEX (chỉ mục) trong MySQL

<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
  // Kiểm tra truy vấn khi bảng chưa INDEX (chỉ mục) trong MySQL
   echo "<b>Kiểm tra truy vấn khi bảng chưa INDEX (chỉ mục) trong MySQL</b><br>";
   $sql ="EXPLAIN SELECT ip,thoigian FROM `tb_truycap` WHERE ip='162.120.184.46'";	
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể Kiểm tra truy vấn: ' . mysql_error());  
   }
   $ktract = mysql_fetch_array($ketquamot, MYSQL_ASSOC);
   echo "rows (số dòng quét qua): ".$ktract['rows']."<br>";
   echo "possible_keys: ".$ktract['possible_keys']."<br>";
   echo "key: ".$ktract['key']."<br>";
   echo "key_len: ".$ktract['key_len']."<br>";
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Kiểm tra truy vấn khi bảng chưa INDEX (chỉ mục) trong MySQL
rows (số dòng quét qua): 4015
possible_keys:
key:
key_len:

Lúc chưa index cột thì lúc where 1 ip thì phải quét hết toàn bộ số dòng có trong bảng.

Các loại INDEX (chỉ mục) trong MySQL

INDEX (chỉ mục) cho 1 cột trong MySQL

Bạn kiểm tra code nếu có trường hợp WHERE chỉ 1 cột mà cột đó có thể INDEX (chỉ mục) được thì mới đêm ra dùng, chứ INDEX (chỉ mục) mà không dùng thì rất ảnh hưởng đến quá trình tải web, vì nhóm index cũng cập nhật lại mỗi khi cột thay đổi hoặc thêm mới, nhóm này index cho cột nào thì khi where cột đó sẽ quét ít dòng hơn (thậm chí chỉ quét 1 hàng nếu giá trị của cột đó không trùng lặp) nên truy vấn rất nhanh.

<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   //INDEX (chỉ mục) cho 1 cột trong MySQL
   echo "<b>INDEX (chỉ mục) cho 1 cột trong MySQL</b><br>";
   
   // INDEX (chỉ mục) cho 1 cột IP
   echo "<b>INDEX (chỉ mục) cho 1 cột IP</b><br>";
   $sql ="CREATE INDEX i_ip ON tb_truycap (ip)";	
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể INDEX (chỉ mục) cho 1 cột IP: ' . mysql_error());  
   }else{
	  echo "INDEX (chỉ mục) cho 1 cột IP thành công!"; 
   }
   // INDEX (chỉ mục) cho 1 cột thoigian
   echo "<b>INDEX (chỉ mục) cho 1 cột thoigian</b><br>";
   $sql ="CREATE INDEX i_thoigian ON tb_truycap (thoigian)";	
   $ketquahai = mysql_query($sql,$conn);
   echo "<br>";
   if(!$ketquahai){
	  die('Không thể INDEX (chỉ mục) cho 1 cột thoigian: ' . mysql_error());  
   }else{
	  echo "INDEX (chỉ mục) cho 1 cột thoigian thành công!"; 
   }
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

INDEX (chỉ mục) cho 1 cột trong MySQL
INDEX (chỉ mục) cho 1 cột IP
INDEX (chỉ mục) cho 1 cột IP thành công!
INDEX (chỉ mục) cho 1 cột thoigian
INDEX (chỉ mục) cho 1 cột thoigian thành công!

INDEX (chỉ mục) cho nhiều cột trong MySQL

Bạn kiểm tra code của bạn nếu có trường hợp nào WHERE nhiều cột mà những cột đó có thể index được thì mới index những cột đó vô một nhóm.

<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   //INDEX (chỉ mục) cho nhiều cột trong MySQL
   echo "<b>INDEX (chỉ mục) cho nhiều cột trong MySQL</b><br>";
   $sql ="CREATE INDEX i_thoigian_ip ON tb_truycap (thoigian,ip)";	
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể INDEX (chỉ mục) cho i_thoigian_ip: ' . mysql_error());  
   }else{
	  echo "INDEX (chỉ mục) cho tên nhóm i_thoigian_ip thành công!"; 
   }
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

INDEX (chỉ mục) cho nhiều cột trong MySQL
INDEX (chỉ mục) cho tên nhóm i_thoigian_ip thành công!

Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) trong MySQL

Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) 1 cột trong MySQL

<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) cột IP trong MySQL
   echo "<b>Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) cột IP trong MySQL</b><br>";
   $sql ="EXPLAIN SELECT ip,thoigian FROM `tb_truycap` WHERE ip='157.55.39.59'";	
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể Kiểm tra truy vấn: ' . mysql_error());  
   }
   $ktract = mysql_fetch_array($ketquamot, MYSQL_ASSOC);
   echo "rows (số dòng quét qua): ".$ktract['rows']."<br>";
   echo "possible_keys: ".$ktract['possible_keys']."<br>";
   echo "key: ".$ktract['key']."<br>";
   echo "key_len: ".$ktract['key_len']."<br>";
   // Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) cột IP trong MySQL
   echo "<b>Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) cột thoigian trong MySQL</b><br>";
   $sql ="EXPLAIN SELECT ip,thoigian FROM `tb_truycap` WHERE thoigian='1754538388'";	
   $ketquahai = mysql_query($sql,$conn);
   if(!$ketquahai){
	  die('Không thể Kiểm tra truy vấn: ' . mysql_error());  
   }
   $ktract = mysql_fetch_array($ketquahai, MYSQL_ASSOC);
   echo "rows (số dòng quét qua): ".$ktract['rows']."<br>";
   echo "possible_keys: ".$ktract['possible_keys']."<br>";
   echo "key: ".$ktract['key']."<br>";
   echo "key_len: ".$ktract['key_len']."<br>";
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) cột IP trong MySQL
rows (số dòng quét qua): 1
possible_keys: i_ip
key: i_ip
key_len: 62
Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) cột thoigian trong MySQL
rows (số dòng quét qua): 1
possible_keys: i_thoigian,i_thoigian_ip
key: i_thoigian_ip
key_len: 4

Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) nhiều cột trong MySQL

<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) nhiều cột trong MySQL
   echo "<b>Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) nhiều cột trong MySQL</b><br>";
   $sql ="EXPLAIN SELECT ip,thoigian FROM `tb_truycap` WHERE ip='157.55.39.59' and thoigian='1754694083'";	
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  die('Không thể Kiểm tra truy vấn: ' . mysql_error());  
   }
   $ktract = mysql_fetch_array($ketquamot, MYSQL_ASSOC);
   echo "rows (số dòng quét qua): ".$ktract['rows']."<br>";
   echo "possible_keys: ".$ktract['possible_keys']."<br>";
   echo "key: ".$ktract['key']."<br>";
   echo "key_len: ".$ktract['key_len']."<br>";
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

Kiểm tra truy vấn khi bảng đã INDEX (chỉ mục) nhiều cột trong MySQL
rows (số dòng quét qua): 1
possible_keys: i_ip,i_thoigian,i_thoigian_ip
key: i_thoigian_ip
key_len: 66

Những lưu ý khi sử dụng INDEX (chỉ mục) trong MySQL

- Cột dùng làm index không cho phép NULL.

- Giá trị trên cột dùng làm index không nên bị trùng lặp.

- Bạn nên kiểm tra code nếu cột nào cần dùng WHERE mà có thể index được thì hãy dùng.

- Không nên index nhiều vì mỗi lần cập nhật cột thì bên index vẫn phải làm việc để cập nhật lại.

- Nhóm index 1 cột thì thường dùng cho WHERE  1 cột.

- Nhóm index nhiều cột thì thường dùng cho WHERE nhiều cột kết hợp.

- Giá trị của cột index không nên UPDATE thường xuyên vì như vậy nhóm index sẽ làm việc liên tục.

Lời kết

Cảm ơn các bạn đã tham khảo bài viết INDEX (chỉ mục) trong MySQL.

  • 0 Bình luận
Content Trần Ngọc Thanh
Trần Ngọc Thanh
Content Trần Ngọc Thanh là người viết content có kinh nghiệm nhiều năm tại Web Mới, chuyên viết content bên lĩnh vực website và nhiều lĩnh vực khác
Chia sẻ nội dung đánh giá của bạn về INDEX (chỉ mục) trong MySQL
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *
Đánh giá của bạn
Tên *
Email
Số điện thoại *
Bình luận, Hỏi đáp
Đăng ký tư vấn miễn phí
Tìm hiểu 1 năm không bằng lắng nghe 1 câu tư vấn
Kiến thức PHP
Kiến thức về website
Kiến thức SEO website
0398.259.259