mysql概念特性和优化

####共享锁(shared lock)和排它锁(exclusive lock) 也叫读锁(red lock)和写锁(write lock) ####多版本并发控制,(Multi-Version Concurrency Control) InnoDB的MVCC,通过在每行后面保存2个隐藏列,创建时间和过期时间,类似拉链表,实际存的是系统版本号 ####InnoDB存储引擎 + 事务。如果不需要事务,主要是select和insert,那么可以用MyISAM + 备份。(在线热备份) + 崩溃恢复。MyISAM崩溃后损坏的概率比InnoDB高很多

修改表的存储引擎

先创建新表,用新的引擎,再把数据导入

服务器分类

  • SMP(Symmetric Multi-Processor),对称单节点多核
  • MPP(Massive Parallel Processing),多节点多核

RAID

Redundant Array of Independent Disks(独立磁盘冗余阵列),简称磁盘阵列


####连接mysql mysql -hlocalhost -uroot -p ####查看表信息 show table status like 'user'
####服务器运行状态 show global status ####查看有哪些线程在运行 show full processlist show processlistG,(垂直方式输出) ####基准测试套件 Mysql基准测试套件(Benchmark Suite)是基于Perl开发的,在安装目录下的sql-bench子目录中 ####慢查询日志是否开启 SHOW VARIABLES LIKE 'slow_query_log'; ####慢查询日志存放位置 SHOW VARIABLES LIKE 'slow_query_log_file';
####尽量避免NULL 可为NULL的列使得索引,索引统计和值比较都更复杂。要建索引的列避免NULL ####timestamp和datetime + timestamp包含不同时区的时间,空间效率更高 + datetime保存更大范围,1001到9999年

范式和反范式

  • 范式的表更小,很少有多余的数据,更少需要distinct和group by
  • 缺点是经常需要关联查询
  • 反范式所有数据都在一张表中,可以避免关联查询
  • 缺点是查询最差情况要全表扫描

加快alter table操作的速度

  • 先再1台不提供服务的机器上alter,然后和提供服务的主库切换
  • 建一张新表,导完数据再重命名替换

####B-Tree索引 适用于全键值,键值范围,键前缀。如果查询中有某个列的范围查询,则其右边的列都无法使用索引 ####哈希索引(Memory引擎) 对每行数据的索引列计算一个hash code,将所有的哈希码存储在索引中,同时在哈希表中保存指向每行数据的指针。 #####创建自定义的哈希索引 key很长的时候比如url,where查询条件包括url常量值和经过哈希函数处理后的key,可以使用触发器在insert和update时维护哈希值。不包含常量值会引起哈希冲突 ####空间数据索引(R-Tree) MyISAM支持空间索引,地理数据存储 ####聚簇索引 聚集索引将索引和数据保存在同一个b-tree中 ####数据文件的结构 在data目录中,.MYD是数据文件,.MYI是索引文件,.frm是结构文件 ####explain 使用explain加查询语句,可以查看是否用上索引,有没有做全表扫描等 ```bash mysql> explain select * from user; +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 4 | | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ 1 row in set (0.01 sec) ``` ####optimize 删除大量数据后,容易产生碎片,会使数据文件大小不变(MYD和MYI大小没变),影响插入。optimize可以清除碎片,把分散存储的数据和索引重新挪到一起,操作时会加锁 ####使用索引原则 + 尽可能将要做范围查询的列放到索引后面,以便优化器能用尽可能多的索引列。查询只能使用索引的最左前缀,知道遇到第一个范围条件列 + 可以的条件下,可以把范围查询替换成in(1,2,3)的等值查询
####分而治之 比如删除数据的时候,一次删除大量数据,可能一次锁住很多数据,阻塞其他查询。可以定时任务每个月删除数据,再每次到达一定行后删除,避免一次性删除大量数据。 ####关联查询using select * from a join b on a.id=b.id,可以简写为 select * from a join b using(id) ####分区表 通过分区函数来过滤一些分区 ####存储过程 存储过程速度更快,因为无需网路通信开销,解析开销和优化器开销
原文地址:https://www.cnblogs.com/wanli002/p/10330522.html