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编码,减小数据存储量。
相关文章
相关标签/搜索