mysql-优化二

表结构优化

表中尽量使用短字段、数字类型的列,

比如ip可以通过inet_aton函数转换成int型,转换规则,a.b.c.d 的ip number是:a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方;

mysql> select inet_aton(‘255.255.255.255‘);
+------------------------------+
| inet_aton(‘255.255.255.255‘) |
+------------------------------+
|                   4294967295 |
+------------------------------+

mysql> select inet_ntoa(4294967295);
+-----------------------+
| inet_ntoa(4294967295) |
+-----------------------+
| 255.255.255.255       |
+-----------------------+

垂直分表,即将原表中的列根据业务拆分为多个表,这样带来的好处是将不同业务的查询分散在不同的表中,坏处是当有业务需要多个表的数据时需要join;

水平分表,即将表中数据按照某字段的某些规律(如将id尾字符取16进制的后4位,0-9,a-f进行分表)拆分为多个表,相同的业务在处理不同的客户请求时,就可能会被分配至不同的表中,有利于减轻db复合;

InnoDB缓存池

mysql> show variables like ‘innodb%pool%‘;
+-------------------------------------+----------------+
| Variable_name                       | Value          |
+-------------------------------------+----------------+
| innodb_additional_mem_pool_size     | 8388608        |
| innodb_buffer_pool_dump_at_shutdown | OFF            |
| innodb_buffer_pool_dump_now         | OFF            |
| innodb_buffer_pool_filename         | ib_buffer_pool |
| innodb_buffer_pool_instances        | 8              |
| innodb_buffer_pool_load_abort       | OFF            |
| innodb_buffer_pool_load_at_startup  | OFF            |
| innodb_buffer_pool_load_now         | OFF            |
| innodb_buffer_pool_size             | 134217728      |
+-------------------------------------+----------------+

可以通过SET GLOBAL innodb_buffer_pool_size=xxx;进行设置。

innodb_buffer_pool_dump_at_shutdown用于在mysql关闭时保存缓存中的热数据,innodb_buffer_pool_load_at_startup用于在mysql开启时恢复保存的热数据至缓存。

char、varchar、text、blob

char在存储时有固定的长度(1-255,即一个字节),多于设定长度的字符串会被截取,少于设定的长度会被填充,固定长度的优势在于插入速度快(必须整行都是固定长度);

varchar在存储时长度可变(1-65535,64k,即两个字节全1的情况,该大小表示字节数而不是字符数,65535包括表示长度的两个字节,VARCHAR(86)存储中文就是3 × 85 + 1 = 256个字节,需要两个字节记录长度),多于设定长度的字符串会被截取,少于设定的长度不会被填充,变长的优势在于存储不确定长度字符串时,可以节省空间。

text与varchar类似,也是变长的,其又分为TINYTEXTTEXT,MEDIUMTEXT, and LONGTEXT,依次使用1、2、3、4个字节来表示长度

blob与text类似,又分为TINYBLOBBLOBMEDIUMBLOB, and LONGBLOB

char、varchar、text可以选择是否忽略大小写:

mysql> select ‘abc‘=‘Abc‘ COLLATE utf8_general_ci;
+--------------+
| ‘abc‘=‘Abc‘ |
+--------------+
|            1 |
+--------------+

mysql> select ‘abc‘=‘Abc‘ COLLATE utf8_bin;
+--------------+
| ‘abc‘=‘Abc‘ |
+--------------+
|            0 |
+--------------+

mysql中行的最大长度为65535(即2的16次方-1)个字节,列的最大长度受此限制,行中并不存储text、blob的内容,只是存储了其地址,在对text、blob建立索引时,必须指定索引前缀长度。注意,只有在表中的所有列都是固定长度时,char对于varchar的速度优势才会体现,否则char并不必varchar更高效。

如果插入的字符串的末尾有空格,char会抹去空格,varchar会保留空格。

char、varchar、text在进行比较操作时(比如=),都会舍去末尾的空格(LIKE属于模式匹配操作):

mysql> select ‘abc‘=‘abc    ‘;
+--------------+
| ‘abc‘=‘abc    ‘ |
+--------------+
|            1 |
+--------------+

mysql> select ‘abc‘ LIKE ‘abc    ‘;
+--------------+
| ‘abc‘ LIKE ‘abc    ‘ |
+--------------+
|            0 |
+--------------+

批量更新

jdbc

 1 try{
 2      Class.forName("com.MySQL.jdbc.Driver");
 3      conn = DriverManager.getConnection(o_url, userName,password);
 4      conn.setAutoCommit(false);
 5      String sql = "INSERT user(user_name, password) VALUES (?, ?)";
 6      PreparedStatement prest =conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
 7      for(User user: users){
 8         prest.setString(1,user.getUserName);
 9         prest.setString(2,user.getPassword);
10         prest.addBatch();
11      }
12      prest.executeBatch();
13      conn.commit();
14
15 } catch (SQLException ex){
16   Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null,ex);
17 } catch (ClassNotFoundException ex){
18
19   Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null,ex);
20 }finally{
21     conn.close();
22 }

mapper.xml

1 <!-- 批量增加操作 -->
2     <insert id="batchInsert">
3         insert into user(user_name,password) values
4 <!--@Param List<User> users-->
5         <foreach collection="users" item="item" index="index" separator=",">
6             (#{item.userName},#{item.password})
7         </foreach>
8     </insert>  

update、delete也类似。

参考:

https://dev.mysql.com/doc/refman/5.7/en/blob.html

https://dev.mysql.com/doc/refman/5.7/en/char.html

http://www.cnblogs.com/roverliang/p/6501768.html

时间: 2024-10-14 02:19:03

mysql-优化二的相关文章

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头

数据库性能优化二:数据库表优化

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表,范式产生于20世纪70年代初,一般表设计满足前三范式就可以,在这里简单介绍一下前三范式 先给大家看一下百度百科给出的定义: 第一范式(1NF)无重复的列 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域

MySQL 第八天(核心优化二)

一.昨天内容回顾 存储引擎 保存数据的格式(技术),不同格式体现特性不一样 myisam ① 结构.数据.索引 文件单独存储 ② 存入数据顺序(不考虑主键顺序) ,写入数据速度快 ③ 并发性,低,锁整张表 ④ 压缩机制 innodb ① 结构有单独文件,数据和索引合并到一个文件中 (通过设置,可以给每个表设置一个"数据/索引"文件) ② 存入数据顺序(给考虑主键值的先后顺序,数值大小排序存储) ③ 并发性,高,锁行 字段选择 ① 字段选取占据空间小的(bigint int medium

Mysql性能优化二

建立适当的索引 1.索引的原理说明 btree类型的索引,就是使用的二分查找法,肯定快啊,算法复杂度是log2N,也就是说16条数据查4次,32条数据查5次,64条数据查6次....依次类推.使用索引跟没使用索引的区别,就跟我们使用新华字典查字,一个是根据拼音或者笔画查找,一个是从头到尾一页一页翻. 2.索引的代价 磁盘占用 对dml(update delete insert)语句的效率影响 btree 方式检索,算法复杂度: log2N 次数 3.哪些列上适合添加索引 较频繁的作为查询条件字段

数据库优化二

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行.having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组. 只有create.alter.drop三个语句带有table,这三个都是数据定义语言(DDL)数据操作语言(DML):insert.update.delete则不需要带table这个

Oracle的SQL优化二

收到开发提交的一条SQL,在高并发下较慢,看能否做一些优化: 该SQL是1个表对另一个表做Left join,首先执行下看看, SQL> select l.vcno,opttype,add_points,optdate,remark,memid,id,FAMILYID,create_Username,billno,billtype,billsubcase,reduce_Points, l.addnum,addpresentum,reducenum,reducepresentnum 2  from

Zabbix优化二:Agentd主动模式

当主机数量过多的时候,由Server端去收集数据,Zabbix会出现严重的性能问题,主要表现如下: 1.Web操作很卡,容易出现502 2.图层断裂 3.开启的进程(Pollar)太多,即使减少item数量,以后加入一定量的机器也会有问题 所以下面主要往两个优化方向考虑: 1.用Proxy或者Node模式做分布式监控 2.调整Agentd为主动模式 由于第一个方案需要增加物理机器,所以先尝试第二方案 一.Agentd的配置调整: LogFile=/tmp/zabbix_agentd.log Se

saiku执行速度优化二

上一篇文章介绍了添加filter可以加快查询速度.下面继续分析: 下面这个MDX语句: WITH SET [~FILTER] AS {[create_date].[create_date].[2013-01-01]} SET [~ROWS_dimPartner_dimPartner] AS {[dimPartner].[dimPartner].[name].Members} SET [~ROWS_sight_sight] AS Hierarchize({{[sight].[sight].[cou

SPA页面缓存再优化二

部署到线上的步骤: 拿到打包之后的文件,删除服务器上的文件,再放上去的. 测试1: 更改js文件,删除并上传新包. 额外发现1:如果用户在上传期间,仍然在系统之内,此时即使将服务器上的包删除掉,用户不会跳出系统,只会在控制台上报错. 报错内容: 只是在报错服务器上没有指定的html文件 额外发现2: 已经被缓存了的页面html 刚进页面时会进行从服务器200取到,随后删除服务器的包,已经被缓存下来的html页面是可以正常操作的. 此时再上传新包,用户仍然在已经缓存的页面里,按照老系统正常跑.访问

购物车优化二

在退出系统,打印购物清单后,wait 2s再退出 1 #Author:Archer Zon 2 import time 3 product_list = [ 4 ('iPhone X', 5800), 5 ('Mac Pro', 10800), 6 ('Bike', 800), 7 ('Coffe', 31), 8 ('iWatch', 9800), 9 ('Archerzon Python', 120), 10 ] 11 salary = input("\033[36;1mEnter your