Possible variables for option --set-variable (-O) are: back_log current value: 5 connect_timeout current value: 5 delayed_insert_timeout current value: 300 delayed_insert_limit current value: 100 delayed_queue_size current value: 1000 flush_time current value: 0 interactive_timeout current value: 28800 join_buffer_size current value: 131072 key_buffer_size current value: 1048540 lower_case_table_names current value: 0 long_query_time current value: 10 max_allowed_packet current value: 1048576 max_connections current value: 100 max_connect_errors current value: 10 max_delayed_threads current value: 20 max_heap_table_size current value: 16777216 max_join_size current value: 4294967295 max_sort_length current value: 1024 max_tmp_tables current value: 32 max_write_lock_count current value: 4294967295 net_buffer_length current value: 16384 query_buffer_size current value: 0 record_buffer current value: 131072 sort_buffer current value: 2097116 table_cache current value: 64 thread_concurrency current value: 10 tmp_table_size current value: 1048576 thread_stack current value: 131072 wait_timeout current value: 28800
mysql> SELECT * FROM tbl_name WHERE col1=val1; mysql> SELECT * FROM tbl_name WHERE col2=val2; mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
... WHERE index_part1=1 AND index_part2=2 ... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */ ... WHERE index_part1='hello' AND index_part_3=5 /* optimized like "index_part1='hello'" */
這些WHERE子句不使用索引:
... WHERE index_part2=1 AND index_part3=2 /* index_part_1 is not used */ ... WHERE index=1 OR A=10 /* No index */ ... WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */
注意,上述不意味著你的應用程序將緩慢地以 N log N 退化!當表格變得更大時,只要一切被OS或SQL服務器緩沖,事情將僅僅或多或少地更慢。在數據變得太大不能被緩沖后,事情將開始變得更慢直到你的應用程序僅僅受磁盤尋道限制(它以N log N增加)。為了避免這個增加,索引緩沖隨數據增加而增加。見10.2.3 調節服務器參數。
10.5.2 SELECT查詢的速度 總的來說,當你想要使一個較慢的SELECT ... WHERE更快,檢查的第一件事情是你是否能增加一個索引。見10.4 MySQL 索引的使用。在不同表之間的所有引用通常應該用索引完成。你可以使用EXPLAIN來確定哪個索引用于一條SELECT語句。見7.22 EXPLAIN句法(得到關于一條SELECT的信息)。
mysql> SELECT COUNT(*) FROM tbl_name; mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name; mysql> SELECT MAX(key_part2) FROM tbl_name WHERE key_part_1=constant; mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... LIMIT 10; mysql> SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;
下列查詢僅使用索引樹就可解決(假設索引列是數字的):
mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val; mysql> SELECT COUNT(*) FROM tbl_name WHERE key_part1=val1 AND key_part2=val2; mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;
下列查詢使用索引以排序順序檢索,不用一次另外的排序:
mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... mysql> SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,...
10.5.4 MySQL怎樣優化LEFT JOIN 在MySQL中,A LEFT JOIN B實現如下:
連接:(3) 發送查詢給服務器:(2) 分析查詢:(2) 插入記錄:(1 x 記錄大?。?br />插入索引:(1 x 索引) 關閉:(1) 這里的數字有點與總體時間成正比。這不考慮打開表的初始開銷(它為每個并發運行的查詢做一次)。
表的大小以N log N (B 樹)的速度減慢索引的插入。
加快插入的一些方法:
如果你同時從同一客戶插入很多行,使用多個值表的INSERT語句。這比使用分開INSERT語句快(在一些情況中幾倍)。 如果你從不同客戶插入很多行,你能通過使用INSERT DELAYED語句得到更高的速度。見7.14 INSERT句法。 注意,用MyISAM,如果在表中沒有刪除的行,能在SELECT:s正在運行的同時插入行。 當從一個文本文件裝載一個表時,使用LOAD DATA INFILE。這通常比使用很多INSERT語句快20倍。見7.16 LOAD DATA INFILE句法。 當表有很多索引時,有可能多做些工作使得LOAD DATA INFILE更快些。使用下列過程: 有選擇地用CREATE TABLE創建表。例如使用mysql或Perl-DBI。 執行FLUSH TABLES,或外殼命令mysqladmin flush-tables。 使用myisamchk --keys-used=0 -rq /path/to/db/tbl_name。這將從表中刪除所有索引的使用。 用LOAD DATA INFILE把數據插入到表中,這將不更新任何索引,因此很快。 如果你有myisampack并且想要壓縮表,在它上面運行myisampack。見10.6.3 壓縮表的特征。 用myisamchk -r -q /path/to/db/tbl_name再創建索引。這將在將它寫入磁盤前在內存中創建索引樹,并且它更快,因為避免大量磁盤尋道。結果索引樹也被完美地平衡。 執行FLUSH TABLES,或外殼命令mysqladmin flush-tables。 這個過程將被構造進在MySQL的某個未來版本的LOAD DATA INFILE。
你可以鎖定你的表以加速插入。 mysql> LOCK TABLES a WRITE; mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33); mysql> INSERT INTO a VALUES (8,26),(6,29); mysql> UNLOCK TABLES;
CREATE TEMPORARY TABLE test TYPE=HEAP SELECT tab2.a as a2, tab3.a as a3 FROM tab2, tab3 WHERE tab2.a = tab3.a and c = 0; SELECT tab1.a, test.a3 from tab1, test where tab1.a = test.a1; SELECT tab1.b, test.a3 from tab1, test where tab1.a = test.a1 and something;
我們最初的感覺是Linux在低到中等負載時執行的較好,但是你開始得到導致的高負載時,Solaris將表現更好,因為磁盤IO的極限,但是我們還沒有關于這方面的任何結論。在與一些Linux核心開發者的討論以后,這可能是 Linux 的副作用,它給批處理以太多的資源使得交互的性能變得很低。當大的批處理正在進行時,這使機器感覺很慢且無反應。希望這將在未來的Linux內核中解決。