Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Có phải ký tự đại diện trong cột ngoài cùng bên trái của chỉ mục tổng hợp có nghĩa là các cột còn lại trong chỉ mục không được sử dụng trong tra cứu chỉ mục (MySQL) không?

Đây là những câu hỏi của bạn. Số nhiều. Bằng cách diễn đạt lại chúng (với "nói cách khác"), chúng chỉ là những câu hỏi khác nhau. Làm như vậy không nhất thiết giúp người trả lời dễ dàng hơn. Ngược lại.

Câu hỏi 1:[Câu hỏi tiêu đề] Có phải ký tự đại diện ở cột ngoài cùng bên trái của chỉ mục tổng hợp có nghĩa là các cột còn lại trong chỉ mục không được sử dụng trong tra cứu chỉ mục (MySQL) không?

A1:Không, không có nghĩa là như vậy.

Câu hỏi 2:Có phải ký tự đại diện được sử dụng trong điều kiện last_name có nghĩa là điều kiện first_name sẽ không được sử dụng để giúp MySQL tìm chỉ mục không?

A2:Không, nó không có nghĩa là như vậy. Thêm nữa là phần đuôi của câu hỏi đó thật mơ hồ. Nó đã biết những gì Chỉ mục để sử dụng có thể là một câu trả lời bù đắp cho sự mơ hồ như vậy.

Câu hỏi 3:Nói cách khác, bằng cách đặt một ký tự đại diện vào điều kiện last_name, MySQL sẽ chỉ thực hiện tra cứu chỉ mục một phần (và bỏ qua các điều kiện được đưa ra trong các cột ở bên phải last_name)?

A3:Không. Các cột ngoài cùng bên phải được phục vụ từ chỉ mục tương tự như chiến lược chỉ mục bao trùm, hưởng lợi từ sự chậm chạp của việc tra cứu trang dữ liệu.

Q4:... Ví dụ-1 có nhanh hơn Ví dụ-2 không?

A4:Có. Nó là một chỉ số bao trùm liên quan đến các cột đó. Xem các chỉ mục bao trùm.

Như một bên liên quan đến Q4. Nó không liên quan nếu nó là một PK hoặc không PK. Có thể có hàng tá lý do tại sao PK sẽ gây khó khăn cho ứng dụng của bạn.

(Các) câu trả lời gốc bên dưới:

với chỉ một khóa tổng hợp trên (last_name,first_name) và một truy vấn như bạn đề cập

WHERE first_name LIKE 'joh%'

... Nó sẽ không sử dụng chỉ mục nào cả. Nó sẽ quét bảng. Do không có

  • một khóa cột duy nhất trên first_name
  • khóa tổng hợp với first_name ngoài cùng bên trái

Vì vậy, chúng tôi sẽ quét bảng ở đây.

Vui lòng xem trang Thủ công Chỉ mục Nhiều Cột để đọc thêm. Và tập trung vào left-most khái niệm về nó. Trên thực tế, hãy truy cập trang đó và tìm kiếm từ left .

Xem Trang thủ công trên Giải thích cơ sở trong mysql. Ngoài ra, bài viết Sử dụng Giải thích để Viết Truy vấn Mysql Tốt hơn .

Chỉnh sửa

Đã có một vài chỉnh sửa cho câu hỏi kể từ khi tôi ở đây một hoặc hai giờ trước. Tôi sẽ để lại cho bạn những điều sau đây. Chạy truy vấn thực tế của bạn thông qua giải thích và giải mã thông qua Using Explain ... liên kết ở trên hoặc tham chiếu khác

drop table myNames;
create table myNames
(   id int auto_increment primary key,
    lastname varchar(100) not null,
    firstname varchar(100) not null,
    col4 int not null,
    key(lastname,firstname)
);
truncate table myNames;
insert myNames (lastName,firstName,col4) values
('Smith','John',1),('Smithers','JohnSomeone',1),('Smith3','John4324',1),('Smi','Jonathan',1),('Smith123x$FA','Joh',1),('Smi3jfif','jkdid',1),('r3','fe2',1);

insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;

select count(*) from myNames; 
-- 458k rows

select count(*)
from myNames
where lastname like 'smi%';
-- 393216 rows

select count(*)
from myNames
where lastname like 'smi%' and firstname like 'joh%';
-- 262144 rows

Explain hiển thị số voodoo cho rows . Thư? Có, bởi vì một truy vấn có khả năng sẽ chạy trong một giờ, bạn đang yêu cầu explain để cung cấp cho bạn một số đếm mờ, không chạy nó và cung cấp cho bạn câu trả lời đó sau 2 giây hoặc ít hơn. Đừng coi đây là số lượng thực # của tiêu chí khi nó được chạy trong thực tế, mà không cần explain .

explain 
select count(*) 
from myNames 
where lastname like 'smi%';
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
| id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows   | Extra                    |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | myNames | range | lastname      | lastname | 302     | NULL | 233627 | Using where; Using index |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+

explain 
select count(*) 
from myNames 
where lastname like 'smi%' and firstname like 'joh%' and col4=1;
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
| id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows   | Extra                    |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | myNames | range | lastname      | lastname | 604     | NULL | 233627 | Using where; Using index |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+


-- the below chunk is interest. Look at the Extra column

explain 
select count(*) 
from myNames 
where lastname like 'smi%' and firstname like 'joh%' and col4=1;
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | myNames | ALL  | lastname      | NULL | NULL    | NULL | 457932 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+

explain 
select count(*) 
from myNames 
where firstname like 'joh%';
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
| id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows   | Extra                    |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | myNames | index | NULL          | lastname | 604     | NULL | 453601 | Using where; Using index |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+


analyze table myNames;
+----------------------+---------+----------+----------+
| Table                | Op      | Msg_type | Msg_text |
+----------------------+---------+----------+----------+
| so_gibberish.mynames | analyze | status   | OK       |
+----------------------+---------+----------+----------+

select count(*) 
from myNames where left(lastname,3)='smi';
-- 393216 -- the REAL #
select count(*) 
from myNames where left(lastname,3)='smi' and left(firstname,3)='joh';
-- 262144 -- the REAL #

explain 
select lastname,firstname 
from myNames  
where lastname like 'smi%' and firstname like 'joh%';
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
| id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows   | Extra                    |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | myNames | range | lastname      | lastname | 604     | NULL | 226800 | Using where; Using index |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tìm sự khác biệt giữa hai ngày trong MySQL

  2. Sử dụng bí danh cho máy chủ localhost trong MySQL

  3. Đặt mức độ ưu tiên giữa các quy trình mysql

  4. Tiết kiệm 30 tháng 2 trên Mysql (Định dạng ngày)

  5. Làm thế nào để CHỌN theo MAX (ngày)?