mysql 优化(1)表的优化与列类型选择

表的优化:

1: 定长与变长分离

如 id int, 占4个字节, char(4)占4个字符长度,也是定长,
time 即每一单元值占的字节是固定的.

核心且常用字段,宜建成定长,放在一张表. 而varchar,
text,blob,这种变长字段,适合单放一张表,用主键与核心表关联起来.

sql 执行查询100000条数据 会因为所有都是定常而跳过的非常迅速 

2:常用字段和不常用字段要分离.

需要结合网站具体的业务来分析,分析字段的查询场景,查询频度低的字段,单拆出来.

3:在1对多,需要关联统计的字段上,添加冗余字段.
减少关联查询

看如下bbs的效果 统计的发帖数 不要数 而是通过在栏目下的添加冗余字段,每次发文章更新文章数+1 这样就会减少查询强度

列选择原则:

1:字段类型优先级 整型> date,time >enum,char>varchar > blob,text

列的特点分析:整型:定长,没有国家/地区之分,没有字符集的差异

比如 tinyint 1,2,3,4,5 char(1) a,b,c,d,e, 从空间上,都是占1个字节,但是order
by 排序,前者快

原因: 后者需要考虑字符集与校对集(就是排序规则)

time定长,运算快,节省空间. 考虑时区,写sql时不方便 where
> ‘2005-10-12’; 时间存int 型;
enum: 能起来约束值的目的, 内部用整型来存储,但与char联查时,内部要经历串与值的转化
char 定长, 考虑字符集和(排序)校对集
varchar, 不定长 要考虑字符集的转换与排序时的校对集,速度慢.
text/blob 无法使用内存临时表(排序等操作只能在磁盘上进行)

性别: 以utf8为例

char(1) , 3个字长字节

enum(‘男’,’女’); // 内部转成数字来存,多了一个转换过程

tinyint() , // 0 1 2 // 定长1个字节.

sql 优化书籍 《mysql 高性能优化》

关于date/time的选择,大师的明确意见,直接选int unsgined not null ,存储时间戳http://www.xaprb.com/blog/2014/01/30/timestamps-in-mysql/

时间—>存成整型

2: 恰好够用就行,不要慷慨(如smallint,varchar(n))

原因: 大的字段浪费内存,影响速度,

以年龄为例 tinyint unsigned not null ,可以存储255岁,足够.用int浪费了3个字节

以varchar(10) ,varchar(300)存储的内容相同,但在表联查时,varchar(300)要花更多内存

3: 尽量避免用null()

原因: null不利于索引,要用特殊的字节来标注.

在磁盘上占据的空间其实更大.(mysql5.7已对null做的改进,但查询仍是不便)

实验:

可以建立2张字段相同的表,一个允许为null,一个不允许为null,各加入1万条,查看索引文件的大小.可以发现,为null的索引要大些.(mysql5.5里,关于null已经做了优化,大小区别已不明显)

另外: null也不便于查询,

where 列名=null; 

where 列名!=null;都查不到值,

where 列名 is null ,或is not null才可以查询.

create table dictnn (id int,word varchar(14) not null default '',key(word))engine myisam charset utf8;
create table dictyn (id int,word varchar(14),key(word))engine myisam charset utf8;
alter table dictnn disable keys;alter table dictyn disable keys;
insert into dictnn select id,if(id%2,word,'') from dict limit 10000;insert into dictyn select id,if(id%2,word,null) from dict limit 10000;
alert table dictnn enable keys;alter table dictyn enable keys;

Enum列的说明

1: enum列在内部是用整型来储存的

2: enum列与enum列相关联速度最快

3: enum列比(var)char的弱势—在碰到与char关联时,要转化.要花时间.

4: 优势在于,当char非常长时,enum依然是整型固定长度.

当查询的数据量越大时,enum的优势越明显.

5: enum与char/varchar关联,因为要转化,速度要比enum->enum,char->char要慢,

但有时也这样用—–就是在数据量特别大时,可以节省IO.

试验:

create table t2 (id int,gender enum('man','woman'),key(gender))engine myisam charset utf8;
create table t3 (id int,gender char(5) not null default '',key(gender))engine myisam charset utf8;
alter table t2 disable keys;alter table t3 disable keys;
insert into t2 select id,if(id%2,'man','woman') from dict limit 10000;insert into t3 select id,if(id%2,'man','woman') from dict limit 10000;
alter table t2 enable keys;alter table t3 enable keys;mysql> select count(*) from t2 as ta,t2 as tb where ta.gender=tb.gendermysql> select count(*) from t3 as ta,t3 as tb where ta.gender=tb.gender

列列

   时间

   

Enumenum

   10.53

   

Charchar

   24.65

   

爱图表 爱图表

AI驱动的智能化图表创作平台

爱图表 99 查看详情 爱图表

Enumchar

   18.22

   

如果t2表的优势不明显,加大t3的gender列,char(15),
char(20)…

随着t3 gender列的变大,t2表优势逐渐明显.

原因—-无论enum(‘manmaman’,’womanwomanwoman’)枚举的字符多长,

内部都是用整型表示, 在内存中产生的数据大小不变,

而char型,却在内存中产生的数据越来越多.

总结: enum 和enum类型关联速度比较快

Enum 类型 节省了IO

 以上就是mysql 优化(1)表的优化与列类型选择的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/419229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月7日 08:50:12
下一篇 2025年11月7日 08:51:33

相关推荐

  • MySQL网络延迟性能优化_MySQL减少响应时间方法

    mysql网络延迟问题可通过多层面诊断与优化解决。1.诊断需从网络、mysql状态、数据包分析及系统资源四方面入手;2.调整tcp_nodelay、socket_buffer_size、max_allowed_packet等参数;3.使用连接池、长连接、查询缓存减少连接开销;4.sql优化包括精简字…

    2025年12月4日 数据库
    000
  • mysql查询响应如何加速_mysql优化漏斗模型

    先检查硬件与系统资源,确认磁盘IO、内存和CPU是否瓶颈,避免盲目优化SQL。 MySQL查询响应变慢,往往不是单一问题导致的。要系统性优化,可以借助“优化漏斗模型”——从宏观到微观逐层排查,过滤掉非关键因素,精准定位瓶颈。这个模型帮助你按优先级处理问题,避免盲目调优。 1. 检查硬件与系统资源 在…

    2025年12月2日 数据库
    000
  • MySQL性能优化之一:提高MySQL并发能力的思路

    1、使用行级别锁,避免表级别或页级别锁尽量使用支持行级别锁的存储引擎,如InnoDB;只在读操作显著多于写作的场景中(如数据仓库类的应用)使用表级别锁的存储引 1、使用行级别锁,避免表级别或页级别锁 尽量使用支持行级别锁的存储引擎,虚拟主机,如InnoDB;只在读操作显著多于写作的场景中(如数据仓库…

    2025年12月2日
    000
  • 如何通过索引对MySQL优化

    %ignore_a_1%可对mysql进行优化,当数据表的数据什分庞大时就可以通过建立索引来解决这个问题,索引将表中的数据按照字母的顺序存储在单独的位置上来优化数据库性能 MySQL中的数据库索引可以帮助我们优化性能,对于小型的数据表来说可能差异性很小但是对于拥有大量数据的表来说,索引有明显的提高性…

    2025年12月2日 数据库
    000
  • 如何在mysql中优化网络延迟影响

    降低MySQL网络延迟需从连接管理、数据传输和架构设计入手,使用连接池减少握手开销;2. 通过批量操作、存储过程减少往返次数;3. 启用压缩协议减小传输体积;4. 优化查询以减少数据传输量;5. 将数据库部署在靠近应用的节点或使用本地只读副本缩短物理距离,提升响应速度。 MySQL的性能不仅依赖于服…

    2025年12月2日 数据库
    000
  • mysql如何优化OR条件_mysql OR条件查询优化方法

    使用UNION替代OR可提升索引效率,确保OR字段均有索引以启用index_merge,合理创建复合索引,重写查询为IN或范围条件减少OR使用,结合EXPLAIN分析执行计划优化查询路径。 在MySQL中,OR条件查询常常会导致索引失效,从而引发全表扫描,影响查询性能。优化OR查询的关键在于确保查询…

    2025年12月2日 数据库
    000
  • mysql数据库优化的基本概念_mysql数据库优化概念方法

    MySQL优化需从索引、SQL语句、表结构和配置参数入手。1. 合理创建索引,遵循最左前缀原则,避免冗余;2. 优化SQL,避免全表扫描和函数操作导致索引失效;3. 设计规范的表结构,选择合适数据类型并适度反范式化;4. 调整innodb_buffer_pool_size、max_connectio…

    2025年12月2日 数据库
    000
  • 如何在mysql中优化锁等待_mysql锁等待优化技巧

    答案:优化MySQL锁等待需缩短事务周期、合理使用索引、选择合适隔离级别并避免死锁。具体包括避免长事务、移出非数据库操作、及时提交、批量更新;确保WHERE条件走索引,避免全表扫描;优先使用READ COMMITTED减少间隙锁;统一访问顺序降低死锁风险,应用层实现重试机制。定期分析执行计划与死锁日…

    2025年12月2日 数据库
    000
  • mysql如何优化排序文件_mysql排序文件优化方法

    优先创建联合索引(如idx_city_age)使排序字段有序,避免filesort;确保索引顺序与ORDER BY一致,覆盖查询字段减少回表;MySQL 8.0+支持混合排序方向;无法避免时调大sort_buffer_size至1MB~8MB减少磁盘I/O;用EXPLAIN FORMAT=JSON检…

    2025年12月2日 数据库
    000
  • 如何在mysql中优化数据库性能_mysql性能优化方法

    数据库性能优化是提升系统响应速度和稳定性的关键环节。在MySQL中,合理的配置、索引设计和查询优化能显著提高运行效率。以下是一些实用且有效的MySQL性能优化方法。 合理使用索引 索引是提升查询速度最直接的方式,但不恰当的使用反而会拖慢写入性能。 建议: 为频繁用于WHERE、JOIN、ORDER …

    2025年12月2日 数据库
    000
  • 如何在mysql中优化多表连接_mysql多表连接优化技巧

    答案:优化MySQL多表连接需确保连接字段有索引、提前过滤数据、选择合适JOIN类型并利用EXPLAIN分析执行计划。具体包括在ON字段创建索引(如表B.a_id),减少扫描行数,优先使用INNER JOIN,避免全表扫描和临时表,通过执行计划持续调优以提升性能。 在MySQL中进行多表连接查询时,…

    2025年12月2日 数据库
    000
  • 如何在mysql中使用前缀索引_mysql前缀索引优化方法

    前缀索引是对字符串前N个字符创建索引,用于节省空间并提升查询效率,适用于VARCHAR等长字段;通过计算不同长度下的唯一值比例选择最佳前缀长度,确保高选择性;但不支持ORDER BY、GROUP BY和覆盖索引,需结合业务数据分布权衡长度。 在MySQL中,当字段内容较长时(如VARCHAR(255…

    2025年12月2日 数据库
    000
  • mysql中查询优化器的操作

    查询优化器的核心任务是生成高效执行计划,通过分析语法树、生成候选方案、估算成本并选择最优路径来提升SQL执行效率,其决策受索引统计、WHERE条件、JOIN顺序和数据类型匹配影响,开发者可通过EXPLAIN分析、强制索引、调整optimizer_switch等手段干预,需注意统计信息更新与复杂查询的…

    2025年12月2日 数据库
    000
  • mysql索引覆盖如何做到_mysql覆盖索引解析

    覆盖索引是指查询所需字段均包含在某个索引中,无需回表获取数据。例如在users表中对(name, age)建立联合索引后,执行SELECT name, age FROM users WHERE name = ‘John’可直接从索引获取数据,执行计划的Extra显示Using…

    2025年12月2日 数据库
    000
  • MySQL优化之分区表_MySQL

    当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种:   1、分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多。     优点:提高并发量,减小锁的粒度    缺点:代码维护成本高,相关sql都需要改动   2、分区,所有的数据还在一个…

    2025年12月2日 数据库
    000
  • 如何在mysql中优化OR条件_mysql OR条件优化方法

    优化OR查询需确保各条件字段有独立索引,优先用UNION ALL拆分不同字段的OR,同字段多值OR改写为IN,避免函数导致索引失效。 在MySQL中,OR条件常常会导致查询性能下降,尤其是在没有合理索引支持的情况下。MySQL执行带有OR的查询时,优化器可能无法有效使用索引,甚至会退化为全表扫描。因…

    2025年12月2日 数据库
    000
  • 如何在mysql中优化临时文件_mysql临时文件优化技巧

    优化MySQL临时文件使用需从内存配置、SQL优化和索引设计入手。1. 调整tmp_table_size和max_heap_table_size参数,提升内存临时表容量,避免频繁落盘;2. 优化SQL结构,减少DISTINCT、UNION及跨表JOIN的排序操作,优先使用UNION ALL;3. 建…

    2025年12月2日 数据库
    000
  • mysql如何排查索引失效_mysql索引失效排查技巧

    答案是使用EXPLAIN分析执行计划,检查type、key、rows和Extra字段,排查函数操作、隐式转换、LIKE前模糊、OR连接不当、未遵循最左前缀等问题,确保索引设计合理并更新统计信息。 索引失效是MySQL性能问题的常见根源。当查询没有走预期的索引,会导致全表扫描,响应变慢,资源消耗增加。…

    2025年12月2日 数据库
    000
  • mysql数据库执行计划是什么_mysql执行计划概念解析

    执行计划是MySQL优化器生成的查询执行步骤描述,通过EXPLAIN命令可查看,包含id、select_type、table、type、possible_keys、key、key_len、ref、rows、filtered和Extra等关键字段,用于分析查询性能,判断索引使用情况、全表扫描、排序或临…

    2025年12月2日 数据库
    000
  • 如何在mysql中优化GROUP BY查询_mysql分组查询优化方法

    优化GROUP BY查询需建立合适索引,利用覆盖索引减少回表,避免临时表和文件排序,并通过WHERE过滤缩小数据范围,结合EXPLAIN分析执行计划以提升性能。 在MySQL中,GROUP BY查询常用于数据聚合分析,但随着数据量增大,查询性能可能显著下降。优化这类查询的关键在于减少扫描行数、合理使…

    2025年12月2日 数据库
    000

发表回复

登录后才能评论
关注微信