日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL的索引特性

發布時間:2024/4/11 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL的索引特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL的索引特性

文章目錄

    • MySQL的索引特性
    • 1. 基本原理
    • 2. 創建索引
    • 2.1 創建主鍵索引
    • 2.2 唯一索引的創建
    • 2.3 普通索引的創建
    • 2.3 全文索引的創建
    • 3. 查詢索引
    • 4. 刪除索引
    • 5. 索引創建原則

索引:提高數據庫的性能,索引是物美價廉的東西了。不用加內存,不用改程序,不用調sql,只要執行正確的create index ,查詢速度就可能提高成百上千倍。但是天下沒有免費的午餐,查詢速度的提高是以插入、更新、刪除的速度為代價的,這些寫操作,增加了大量的IO。所以它的價值,在于提高一個海量數據的檢索速度。

常見索引分為:

  • 主鍵索引(primary key)
  • 唯一索引(unique)
  • 普通索引(index)
  • 全文索引(fulltext)–解決中子文索引問題。

案例:

先整一個海量表,在查詢的時候,看看沒有索引時有什么問題?

--構建一個8000000條記錄的數據 --構建的海量表數據需要有差異性,所以使用存儲過程來創建, 拷貝下面代碼就可以了 -- 產生隨機字符串 delimiter $$ create function rand_string(n INT) returns varchar(255) begin declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; declare return_str varchar(255) default ''; declare i int default 0; while i < n do set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1)); set i = i + 1; end while; return return_str; end $$ delimiter ;--產生隨機數字 delimiter $$ create function rand_num() returns int(5) begin declare i int default 0; set i = floor(10+rand()*500); return i; end $$ delimiter ;--創建存儲過程,向雇員表添加海量數據 delimiter $$ create procedure insert_emp(in start int(10),in max_num int(10)) begin declare i int default 0; set autocommit = 0; repeat set i = i + 1; insert into EMP values ((start+i) ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num()); until i = max_num end repeat; commit; end $$ delimiter ;-- 執行存儲過程,添加8000000條記錄 call insert_emp(100001, 8000000);

到此,已經創建出了海量數據的表了。

  • 查詢員工編號為998877的員工
select * from EMP where empno=998877;

共耗時4.93秒,這還是在本機一個人來操作,在實際項目中,如果放在公網中,假如同時有1000個人并發查詢,那很可能就死機。

  • 解決方法,創建索引
alter table EMP add index(empno);
  • 換一個員工編號,測試看看查詢時間
select * from EMP where empno=123456;

1. 基本原理


索引的特性:

  • 占用磁盤空間
  • 當添加一條記錄,除了添加到表中,還要維護二叉樹,速度有影響,但不大
  • 當我們添加一個索引,不能夠解決所有查詢問題,需要分別給字段建立索引;例如 select * from EMP where ename=‘abcdef’;
  • 索引是以空間換時間

2. 創建索引

2.1 創建主鍵索引

第一種方式:

-- 在創建表的時候,直接在字段名后指定 primary key create table user1(id int primary key, name varchar(30));

第二種方式:

-- 在創建表的最后,指定某列或某幾列為主鍵索引 create table user2(id int, name varchar(30), primary key(id));

第三種方式:

create table user3(id int, name varchar(30)); -- 創建表以后再添加主鍵 alter table user3 add primary key(id);

主鍵索引的特點:

  • 一個表中,最多有一個主鍵索引,當然可以使符合主鍵
  • 主鍵索引的效率高(主鍵不可重復)
  • 創建主鍵索引的列,它的值不能為null,且不能重復
  • 主鍵索引的列基本上是int

2.2 唯一索引的創建

第一種方式:

-- 在表定義時,在某列后直接指定unique唯一屬性。 create table user4(id int primary key, name varchar(30) unique);

第二種方式:

-- 創建表時,在表的后面指定某列或某幾列為unique create table user5(id int primary key, name varchar(30), unique(name));

第三種方式:

create table user6(id int primary key, name varchar(30)); alter table user6 add unique(name);

唯一索引的特點:

  • 一個表中,可以有多個唯一索引
  • 查詢效率高
  • 如果在某一列建立唯一索引,必須保證這列不能有重復數據
  • 如果一個唯一索引上指定not null,等價于主鍵索引

2.3 普通索引的創建

第一種方式:

create table user8(id int primary key, name varchar(20), email varchar(30), index(name) --在表的定義最后,指定某列為索引 );

第二種方式:

create table user9(id int primary key, name varchar(20), email varchar(30)); alter table user9 add index(name); --創建完表以后指定某列為普通索引

第三種方式:

create table user10(id int primary key, name varchar(20), email varchar(30)); -- 創建一個索引名為 idx_name 的索引 create index idx_name on user10(name);

普通索引的特點:

  • 一個表中可以有多個普通索引,普通索引在實際開發中用的比較多
  • 如果某列需要創建索引,但是該列有重復的值,那么我們就應該使用普通索引

2.3 全文索引的創建

當對文章字段或有大量文字的字段進行檢索時,會使用到全文索引。MySQL提供全文索引機制,但是有要求,要求表的存儲引擎必須是MyISAM,而且默認的全文索引支持英文,不支持中文。如果對中文進行全文檢索,可以使用sphinx的中文版(coreseek)

CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) )engine=MyISAM; INSERT INTO articles (title,body) VALUES ('MySQL Tutorial','DBMS stands for DataBase ...'), ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we will show ...'), ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), ('MySQL vs. YourSQL','In the following database comparison ...'), ('MySQL Security','When configured properly, MySQL ...');
  • 查詢有沒有database數據

如果使用如下查詢方式,雖然查詢出數據,但是沒有使用到全文索引

mysql> select * from articles where body like '%database%'; +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 5 | MySQL vs. YourSQL | In the following database comparison ... | +----+-------------------+------------------------------------------+

可以用explain工具看一下,是否使用到索引

mysql> explain select * from articles where body like '%database%'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: articles type: ALL possible_keys: NULL key: NULL <== keynull表示沒有用到索引 key_len: NULL ref: NULL rows: 6 Extra: Using where 1 row in set (0.00 sec)
  • 如何使用全文索引呢?
mysql> SELECT * FROM articles -> WHERE MATCH (title,body) AGAINST ('database'); +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 5 | MySQL vs. YourSQL | In the following database comparison ... | | 1 | MySQL Tutorial | DBMS stands for DataBase ... | +----+-------------------+------------------------------------------+

通過explain來分析這個sql語句

mysql> explain SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database')\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: articles type: fulltext possible_keys: title key: title <= key用到了title key_len: 0 ref: rows: 1 Extra: Using where

3. 查詢索引

第一種方法:

show keys from 表名 mysql> show keys from goods\G *********** 1. row *********** Table: goods <= 表名 Non_unique: 0 <= 0表示唯一索引 Key_name: PRIMARY <= 主鍵索引 Seq_in_index: 1 Column_name: goods_id <= 索引在哪列 Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE <= 以二叉樹形式的索引 Comment: 1 row in set (0.00 sec)

第二種方法:

show index from 表名;

第三種方法:

desc 表名;

4. 刪除索引

第一種方法-刪除主鍵索引:

alter table 表名 drop primary key;

第二種方法-其他索引的刪除:

alter table 表名 drop index 索引名; 索引名就是show keys from 表名中的 Key_name 字段 mysql> alter table user10 drop index idx_name;

第三種方法方法: drop index 索引名 on 表名

mysql> drop index name on user8;

5. 索引創建原則

  • 比較頻繁作為查詢條件的字段應該創建索引
  • 唯一性太差的字段不適合單獨創建索引,即使頻繁作為查詢條件
  • 更新非常頻繁的字段不適合作創建索引
  • 不會出現在where子句中的字段不該創建索引

總結

以上是生活随笔為你收集整理的MySQL的索引特性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。