亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網(wǎng)絡,我們將竭誠為您提供優(yōu)質的服務! 誠征網(wǎng)絡推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯(lián)系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業(yè)務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發(fā)消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

添加mysql索引的幾條原則

添加時間:2014-3-15 15:25:05  添加: 思海網(wǎng)絡 

添加mysql索引的幾條原則:

  一,索引的重要性

  索引用于快速找出在某個列中有一特定值的行。不使用索引,MySQL必須從第1條記錄開始然后讀完整個表直到找出相關的行。表越大,花費的時間 越多。如果表中查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到數(shù)據(jù)文件的中間,沒有必要看所有數(shù)據(jù)。注意如果你需要訪問大部分行,順序讀取要 快得多,因為此時我們避免磁盤搜索。

  假如你用新華字典來查找“張”這個漢字,不使用目錄的話,你可能要從新華字典的第一頁找到最后一頁,可能要花二個小時。字典越厚呢,你花的時間 就越多。現(xiàn)在你使用目錄來查找“張”這個漢字,張的首字母是z,z開頭的漢字從900多頁開始,有了這條線索,你查找一個漢字可能只要一分鐘,由此可見索 引的重要性。但是索引建的是不是越多越好呢,當然不是,如果一本書的目錄分成好幾級的話,我想你也會暈的。

  二,準備工作

  1. //準備二張測試表     
  2. mysql> CREATE TABLE `test_t` (     
  3.  ->   `id` int(11) NOT NULL auto_increment,     
  4.  ->   `num` int(11) NOT NULL default '0',     
  5.  ->   `d_num` varchar(30) NOT NULL default '0',     
  6.  ->   PRIMARY KEY  (`id`)     
  7.  -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;     
  8. Query OK, 0 rows affected (0.05 sec)     
  9.     
  10. mysql> CREATE TABLE `test_test` (     
  11.  ->   `id` int(11) NOT NULL auto_increment,     
  12.  ->   `num` int(11) NOT NULL default '0',     
  13.  ->   PRIMARY KEY  (`id`)     
  14.  -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;     
  15. Query OK, 0 rows affected (0.05 sec)       
  16.     
  17. //創(chuàng)建一個存儲過程,為插數(shù)據(jù)方便     
  18. mysql> delimiter      
  19. mysql> create procedure i_test(pa int(11),tab varchar(30))     
  20.  -> begin     
  21.  ->     declare max_num int(11) default 100000;     
  22.  ->     declare i int default 0;     
  23.  ->     declare rand_num int;     
  24.  ->  declare double_num char;     
  25.  ->     
  26.  ->  if tab != 'test_test' then     
  27.  ->         select count(id) into max_num from test_t;     
  28.  ->         while i < pa do    
  29.  ->             if max_num < 100000 then     
  30.  ->                 select cast(rand()*100 as unsigned) into rand_num;     
  31.  ->                 select concat(rand_num,rand_num) into double_num;     
  32.  ->                 insert into test_t(num,d_num)values(rand_num,double_num);     
  33.  ->             end if;     
  34.  ->             set i = i +1;     
  35.  ->         end while;     
  36.  ->  else    
  37.  ->         select count(id) into max_num from test_test;     
  38.  ->         while i < pa do    
  39.  ->             if max_num < 100000 then     
  40.  ->                 select cast(rand()*100 as unsigned) into rand_num;     
  41.  ->                 insert into test_test(num)values(rand_num);     
  42.  ->             end if;     
  43.  ->             set i = i +1;     
  44.  ->         end while;     
  45.  ->  end if;     
  46.  -> end     
  47. Query OK, 0 rows affected (0.00 sec)     
  48.     
  49. mysql> delimiter ;     
  50. mysql> show variables like "%pro%";   //查看一下,記錄執(zhí)行的profiling是不是開啟動了,默認是不開啟的     
  51. +---------------------------+-------+     
  52.  Variable_name              Value      
  53. +---------------------------+-------+     
  54.  profiling                  OFF        
  55.  profiling_history_size     15         
  56.  protocol_version           10         
  57.  slave_compressed_protocol  OFF        
  58. +---------------------------+-------+     
  59. 4 rows in set (0.00 sec)       
  60.     
  61. mysql> set profiling=1;           //開啟后,是為了對比加了索引后的執(zhí)行時間     
  62. Query OK, 0 rows affected (0.00 sec)  

  三,相關實例

  1,單表數(shù)據(jù)太少,索引反而會影響速度

  1. mysql> call i_test(10,'test_t');    //向test_t表插入10條件     
  2. Query OK, 1 row affected (0.02 sec)     
  3.     
  4. mysql> select num from test_t where num!=0;     
  5. mysql> explain select num from test_t where num!=0\G;     
  6. *************************** 1. row ***************************     
  7.  id: 1     
  8.  select_type: SIMPLE     
  9.  table: test_t     
  10.  type: ALL     
  11.  possible_keys: NULL     
  12.  keyNULL     
  13.  key_len: NULL     
  14.  ref: NULL     
  15.  rows: 10     
  16.  Extra: Using where     
  17. 1 row in set (0.00 sec)     
  18.     
  19. ERROR:     
  20. No query specified     
  21.     
  22. mysql> create index num_2 on test_t (num);     
  23. Query OK, 10 rows affected (0.19 sec)     
  24. Records: 10  Duplicates: 0  Warnings: 0     
  25.     
  26. mysql> select num from test_t where num!=0;     
  27.     
  28. mysql> explain select num from test_t where num!=0\G;     
  29. *************************** 1. row ***************************     
  30.  id: 1     
  31.  select_type: SIMPLE     
  32.  table: test_t     
  33.  type: index     
  34.  possible_keys: num_2     
  35.  key: num_2     
  36.  key_len: 4     
  37.  ref: NULL     
  38.  rows: 10     
  39.  Extra: Using where; Using index     
  40. 1 row in set (0.00 sec)     
  41.     
  42. ERROR:     
  43. No query specified     
  44.     
  45. mysql> show profiles;     
  46. +----------+------------+---------------------------------------------+     
  47.  Query_ID  Duration    Query                                            
  48. +----------+------------+---------------------------------------------+     
  49.         1  0.00286325  call i_test(10,'test_t')                        //插入十條數(shù)據(jù)     
  50.         2  0.00026350  select num from test_t where num!=0              
  51.         3  0.00022250  explain select num from test_t where num!=0      
  52.         4  0.18385400  create index num_2 on test_t (num)              //創(chuàng)建索引     
  53.         5  0.00127525  select num from test_t where num!=0             //使用索引后,差不多是沒有使用索引的0.2倍     
  54.         6  0.00024375  explain select num from test_t where num!=0      
  55. +----------+------------+---------------------------------------------+     
  56. rows in set (0.00 sec)   

  解釋:

  id:表示sql執(zhí)行的順序

  select_type:SIMPLE,PRIMARY,UNION,DEPENDENT UNION,UNION RESULT,SUBQUERY,DEPENDENT SUBQUERY,DERIVED不同的查詢語句會有不同的select_type

  table:表示查找的表名

  type:表示使用索引類型,或者有無使用索引.效率從高到低const、eq_reg、ref、range、index和ALL,其實這個根你sql的寫法有直接關系,例如:能用主鍵就用主鍵,where后面的條件加上索引,如果是唯一加上唯一索引等

  possible_keys:可能存在的索引

  key:使用索引

  key_len:使用索引的長度

  ref:使用哪個列或常數(shù)與key一起從表中選擇行,一般在多表聯(lián)合查詢時會有。

  rows:查找出的行數(shù)

  Extra:額外說明

  前段時間寫過一篇博文mysql distinct和group by誰更好,里面有朋友留言,說測試結果根我當時做的測試結果不一樣,當時我打比方解釋了一下,今天有時間,以例子的形勢,更直觀的表達出索引的工作原理。

  2,where后的條件,order by ,group by 等這樣過濾時,后面的字段最好加上索引。根據(jù)實際情況,選擇PRIMARY KEY、UNIQUE、INDEX等索引,但是不是越多越好,要適度。

  3,聯(lián)合查詢,子查詢等多表操作時關連字段要加索引

  1. mysql> call i_test(10,'test_test');    //向test_test表插入10條數(shù)據(jù)     
  2. Query OK, 1 row affected (0.02 sec)     
  3.     
  4. mysql> explain select a.num as num1,b.num as num2 from test_t as a left join tes     
  5. t_test as b on a.num=b.num\G;     
  6. *************************** 1. row ***************************     
  7.  id: 1     
  8.  select_type: SIMPLE     
  9.  table: a     
  10.  type: index     
  11.  possible_keys: NULL     
  12.  key: num_2     
  13.  key_len: 4     
  14.  ref: NULL     
  15.  rows: 10     
  16.  Extra: Using index     
  17. *************************** 2. row ***************************     
  18.  id: 1     
  19.  select_type: SIMPLE     
  20.  table: b     
  21.  type: ref     
  22.  possible_keys: num_1     
  23.  key: num_1     
  24.  key_len: 4     
  25.  ref: bak_test.a.num   //bak_test是數(shù)據(jù)庫名,a.num是test_t的一個字段     
  26.  rows: 1080     
  27.  Extra: Using index     
  28. 2 rows in set (0.01 sec)     
  29.     
  30. ERROR:     
  31. No query specified   

  數(shù)據(jù)量特別大的時候,最好不要用聯(lián)合查詢,即使你做了索引。

關鍵字:mysql、索引、數(shù)據(jù)庫

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網(wǎng)絡有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國增值電信業(yè)務經(jīng)營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網(wǎng)站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網(wǎng)安 舉報有獎  警警  手機打開網(wǎng)站