MySQL數據庫優化(基於酒店2000w條數據)

接上一篇博客:http://my.oschina.net/twinkling/blog/180619。肯定了表設計: mysql

CREATE TABLE `customer` (
  `Name` varchar(80) NOT NULL,
  `CardNo` varchar(10) DEFAULT NULL,
  `Descriot` varchar(100) DEFAULT NULL,
  `CtfTp` varchar(4) DEFAULT NULL,
  `CtfId` varchar(40) DEFAULT NULL,
  `Gender` varchar(8) DEFAULT NULL,
  `Birthday` int(9) DEFAULT NULL,
  `Address` varchar(100) DEFAULT NULL,
  `Zip` int(10) DEFAULT NULL,
  `Dirty` varchar(20) DEFAULT NULL,
  `District1` varchar(6) DEFAULT NULL,
  `District2` varchar(4) DEFAULT NULL,
  `District3` varchar(6) DEFAULT NULL,
  `District4` varchar(6) DEFAULT NULL,
  `District5` varchar(8) DEFAULT NULL,
  `District6` varchar(20) DEFAULT NULL,
  `FirstNm` varchar(50) DEFAULT NULL,
  `LastNm` varchar(20) DEFAULT NULL,
  `Duty` varchar(20) DEFAULT NULL,
  `Mobile` varchar(40) DEFAULT NULL,
  `Tel` varchar(40) DEFAULT NULL,
  `Fax` varchar(40) DEFAULT NULL,
  `EMail` varchar(60) DEFAULT NULL,
  `Nation` varchar(25) DEFAULT NULL,
  `Taste` varchar(100) DEFAULT NULL,
  `Education` varchar(20) DEFAULT NULL,
  `Company` varchar(80) DEFAULT NULL,
  `CTel` varchar(20) DEFAULT NULL,
  `CAddress` varchar(60) DEFAULT NULL,
  `CZip` int(8) DEFAULT NULL,
  `Family` int(10) DEFAULT NULL,
  `Version` datetime DEFAULT NULL,
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `index_Name_Id` (`Name`, `id`) USING BTREE,
  KEY `index_CtfId_Id` (`CtfId`, `id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

一、參數設置

因爲是查詢爲主的數據庫,因此選用了MyISAM數據庫引擎。開始使用前須要配置一下參數,參考文章:http://isky000.com/database/mysql-perfornamce-tuning-cache-parameter ,主要修改這個參數。 sql

key_buffer_size (global) 
Key Buffer 多是你們最爲熟悉的一個 MySQL 緩存參數了,尤爲是在 MySQL 沒有更換默認存儲引擎的時候,不少朋友可能會發現,默認的 MySQL 配置文件中設置最大的一個內存參數就是這個參數了。key_buffer_size 參數用來設置用於緩存 MyISAM存儲引擎中索引文件的內存區域大小。若是咱們有足夠的內存,這個緩存區域最好是可以存放下咱們全部的 MyISAM 引擎表的全部索引,以儘量提升性能。 此外,當咱們在使用MyISAM 存儲的時候有一個及其重要的點須要注意,因爲 MyISAM 引擎的特性限制了他僅僅只會緩存索引塊到內存中,而不會緩存表數據庫塊。因此,咱們的 SQL 必定要儘量讓過濾條件都在索引中,以便讓緩存幫助咱們提升查詢效率。
因此,該值是越大越好,在/etc/my.cnf文件的[mysqld]頭下,增長:

key_buffer_size=1024M #個人系統內存是2G

注意:1024M是根據系統的內存來設置,要留點內存給系統用。 數據庫

爲了不亂碼問題,所有采用utf8編碼。 緩存

二、建表索引說明

關於爲何索引可以提升效率,請參看這篇文章: http://isky000.com/database/mysql-performance-tuning-index

之因此須要創建複合索引性能

  1. 須要經過索引關鍵字去查找id(確保這個過程是在內存中進行)
  2. 因爲複合索引檢索時只以第一個爲準,因此檢索關鍵字須要放在第一個位置,只能是(name, id) 不能是(id, name)

可是,在索引查詢的時候須要注意幾個問題: 優化

  1. 條件過濾時,最好在索引上完成過濾,回表只是取出額外的數據字段;
  2. 過濾條件好的字段要更靠前;
  3. 當讀取的數據量佔整個數據比例很大,使用索引不必定優於全表掃描;注:在有些模糊查詢中,索引檢索結果有2百萬左右時,再去回表查數據就很慢
  4. 一次數據訪問通常只能利用到一個索引,也就是說並非全部where條件都能用上索引。

三、檢索時SQL語句優化

  1. 條件掃描時,不要搞這種: 編碼

    # 雖然說是要走索引,可是回表操做太慢
    select * from customer where name like '陳%';
    # 沒有關聯的索引也不要使用, name 和 ctfid 之間沒有關聯
    select id, name, ctfid from customer_bk where name like '徐%' ;
  2. 慎用兩個索引條件一塊兒使用,同1,部分走索引,而後回表取數據,再對比 spa

    explain select id from customer_bk where name like '徐%' and ctfid like '5%';
    # 哪一個條件放前面都無所謂,MySQL內部優化了,取數據量少的索引,而後再對比其餘條件
  3. 避免相似IN的子查詢,不能出現以下的SQL語句:
  4. select * from customer where id in (select id from customer where name like '陳'); # 經過 explain 語句,能夠分析其檢索範圍 mysql> explain select * from customer_bk where id in (select id from customer_bk where name like '陳'); +----+--------------------+-------------+-----------------+-----------------------+---------+---------+------+----------+-------------+ | id | select_type        | table       | type            | possible_keys         | key     | key_len | ref  | rows     | Extra       | +----+--------------------+-------------+-----------------+-----------------------+---------+---------+------+----------+-------------+ |  1 | PRIMARY            | customer_bk | ALL             | NULL                  | NULL    | NULL    | NULL | 20050144 | Using where | |  2 | DEPENDENT SUBQUERY | customer_bk | unique_subquery | PRIMARY,index_Name_Id | PRIMARY | 4       | func |        1 | Using where | +----+--------------------+-------------+-----------------+-----------------------+---------+---------+------+----------+-------------+ 2 rows in set (0.00 sec)


四、其餘優化

  1. 表Customer含有大量不須要的字段,能夠考慮分表。可是對於這個簡單業務來講,能夠忍受的。
  2. 編碼問題,在只有中文和英文的狀況下,能夠考慮只使用latin1編碼,減小數據存儲量。
相關文章
相關標籤/搜索