2000w mysql_MySQL数据库优化(基于酒店2000w条数据)
接上一篇博客:外鏈網址已屏蔽。確定了表設計:
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 ;
1、參數設置
由于是查詢為主的數據庫,所以選用了MyISAM數據庫引擎。開始使用前需要配置一下參數,參考文章:外鏈網址已屏蔽?,主要修改這個參數。
key_buffer_size (global)
Key Buffer 可能是大家最為熟悉的一個 MySQL 緩存參數了,尤其是在 MySQL 沒有更換默認存儲引擎的時候,很多朋友可能會發現,默認的 MySQL 配置文件中設置最大的一個內存參數就是這個參數了。key_buffer_size 參數用來設置用于緩存 MyISAM存儲引擎中索引文件的內存區域大小。如果我們有足夠的內存,這個緩存區域最好是能夠存放下我們所有的 MyISAM 引擎表的所有索引,以盡可能提高性能。 此外,當我們在使用MyISAM 存儲的時候有一個及其重要的點需要注意,由于 MyISAM 引擎的特性限制了他僅僅只會緩存索引塊到內存中,而不會緩存表數據庫塊。所以,我們的 SQL 一定要盡可能讓過濾條件都在索引中,以便讓緩存幫助我們提高查詢效率。 所以,該值是越大越好,在/etc/f文件的[mysqld]頭下,增加:
key_buffer_size=1024M #我的系統內存是2G
注意:1024M是根據系統的內存來設置,要留點內存給系統用。
為了避免亂碼問題,全部采用utf8編碼。
2、建表索引說明 關于為什么索引能夠提高效率,請參看這篇文章:
外鏈網址已屏蔽
之所以需要建立復合索引:
需要通過索引關鍵字去查找id(確保這個過程是在內存中進行)
由于復合索引檢索時只以第一個為準,所以檢索關鍵字需要放在第一個位置,只能是(name, id) 不能是(id, name)
但是,在索引查詢的時候需要注意幾個問題:
條件過濾時,最好在索引上完成過濾,回表只是取出額外的數據字段;
過濾條件好的字段要更靠前;
當讀取的數據量占整個數據比例很大,使用索引不一定優于全表掃描;注:在有些模糊查詢中,索引檢索結果有2百萬左右時,再去回表查數據就很慢
一次數據訪問一般只能利用到一個索引,也就是說并不是所有where條件都能用上索引。
3、檢索時SQL語句優化
條件掃描時,不要搞這種: # 雖說是要走索引,但是回表操作太慢
select * from customer where name like '陳%';
# 沒有關聯的索引也不要使用, name 和 ctfid 之間沒有關聯
select id, name, ctfid from customer_bk where name like '徐%' ;
慎用兩個索引條件一起使用,同1,部分走索引,然后回表取數據,再對比 explain select id from customer_bk where name like '徐%' and ctfid like '5%';
# 哪個條件放前面都無所謂,MySQL內部優化了,取數據量少的索引,然后再對比其他條件
避免類似IN的子查詢,不能出現如下的SQL語句:
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)
4、其他優化
表Customer含有大量不需要的字段,可以考慮分表。但是對于這個簡單業務來說,可以忍受的。
編碼問題,在只有中文和英文的情況下,可以考慮只使用latin1編碼,減少數據存儲量。
總結
以上是生活随笔為你收集整理的2000w mysql_MySQL数据库优化(基于酒店2000w条数据)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis学习(7):Windows
- 下一篇: 怎么更好练习数位板_如何设计更好的仪表板