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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

2000w mysql_MySQL数据库优化(基于酒店2000w条数据)

發布時間:2023/12/10 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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条数据)的全部內容,希望文章能夠幫你解決所遇到的問題。

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