MySQL笔记随记

看《MySQL技术内幕(第5版)》,随手做的笔记


SQL操作

  • 使用集合查询时可以with rollup对不同的group进行统计求和
  • 使用mysql < xxx.sql可以导入脚本,或使用source xxx.sql直接执行;反之mysql > xxx.sql可以导出数据库相关信息,具体参数另参考
  • 使用load data local infile <文件路径名,如'member.txt'> into table member将数据直接插入表
  • 不使用排序直接选择出来的记录不一定就是按照插入表的顺序的;null值升序在前,降序在后
  • create table xxx like b创建b的副本;create table xxx select ...可以直接创建
  • alter table dba.a rename to dbb.b将完成数据表的移动

规则

  • MySQL支持数字开头的标识符,一般用反引号加以区别,其他如带有空格、连接符、保留字的也建议如此;另外,操作系统可能在存储数据库或表名的时候,会有一些限制;某些SQL模式可能会对这些有限制要求,要注意
  • 大部分标识符的最大长度为64字符,别名较长为256个字符;

索引

不同的引擎支持不同的索引,如InnoDB就不支持hash索引;Unique索引可以存在Null值,且允许多个null(因为任意两个null是无法进行比较的)

全文检索Fulltext

全文搜索,在不适用模板匹配操作的情况下进行单词或短语的查找。3种类型

  • 自然语言搜索(默认)。MySQL会将搜索字符串解析成一系列的单词,然后搜索出包含这些单词的行
  • 布尔模式搜索。搜索字符串可以包含修饰符,来表明特定需要。
  • 查询拓展搜索。这种搜索分两个阶段,第一阶段是自然语言搜索。第二阶段把原来的搜索字符串,与在第一阶段的搜索里高度匹配的行连接在一起,再进行一次搜索。
  • 全文搜索必须事先建立一个特殊索引,其基于fulltext索引;全文索引将会忽略掉那些常见词;一些内建词如“the”、“after”等和太短——少于4个字符会被忽略。可以为单个或多个列创建索引
  • select * from student where match(sname) against('Tom') 全文搜索中,将按照match的相关程度来进行操作。可在against中根据in natural language mode\in boolean mode\with query expansion来进行不同检索类型的选择。
索引参考意见
  • 在需要搜索、排序、分组的列上建立索引;最佳候选列应该是where、order_by、group_by的或连接子句中的列
  • 在数据列基数较大的列上,如性别就不适合
  • 索引短小的值
  • 索引字符串前缀
  • 利用最左前缀
  • 不要建立过多索引
  • 参与比较的索引类型保持匹配;即索引列和索引类型
  • 利用慢查询日志找出那些性能低劣的查询

引擎

  • 引擎原为“表处理器”,存储引擎。每一种存储引擎所实现的表具有一组特定的属性。主要有InnoDB、MyISAM、ARCHIVE、CSV等,前两者比较常见。

  • ARCHIVE引擎,是用于数据存档的引擎,表现为数据行被插入后就不能再修改了;CSV引擎在进行数据存储时,会以逗号作为数据项间的分隔符。

  • 引擎从编译在系统内部,逐渐变更为可插件加载化、接口化;show ENGINES\G 或 select engine from information_schema.engines

  • 不同的引擎在创建表时会创建一些不同的文件,存储数据、索引等;创建表MySQL会在磁盘中创建一个同名的.frm文件

  • InnoDB引擎是MySQL的默认引擎。具有功能:

    • 表在提交执行和回滚操作时是事务安全的;可以通过创建保存点savepoint实现部分回滚
    • 系统崩溃后可以自动恢复
    • 外键和引用完整性支持,包括级联删除和更新
    • 基于行级别的锁定和多版本化,良好的并发性能
    • V5.6开始支持全文索引和fulltext索引

    默认会把表集中存储在一个系统表空间里,而不是为不同表创建不同文件;

  • MyISAM引擎:

    • 保存连续相似字符串索引值会对键进行压缩,也可以压缩相似的数字索引值;
    • 支持全文检索和fulltext索引
    • 支持空间数据检索和spatial索引

服务

  • 创建数据表默认引擎Engine=InnoDB;该引擎默认使用小写字母存储数据库和表名。
  • 一般默认下,Windows和mac OS系统的MySQL不会区分大小写(SQL的关键字、函数名等应不区分,而数据库、表、视图名等依赖操作系统的文件环境);而Unix系统可能会区分。这些都可以设置; 同样,存储过程、存储函数和事件名不区分大小写;触发器区分大小写;别名区分大小写,列名、索引名不区分大小写。
  • 服务器的SQL模式,是一个系统变量,用来控制一些限制和操作;SQL模式可以全局设置,也可以在不同客户端修改。SQL模式是一些常量枚举值的集合。如set GLOBAL sql_mode='TRADITIONAL'没有global则为会话的临时SQL模式。可以使用select查询:select @@session/global.sql_mode

查询优化

Explain命令、analyze table 命令:

  • 举个例子:explain select * from student where false[\G];\G 竖行显示
  • 查询优化的主要目标其实是尽可能使用索引。

意见:

  • 对表进行分析;生成关于键值分布情况的统计数据,可以帮助优化程序更准确地评估索引效率;表的分析应该在表的数据有更新情况下周期性地进行
  • 使用explain进行分析,验证优化程序的操作;可以用来查询增加索引对于查询是否有优化作用时
  • 必要时给予优化程序提示或改写;straight_join命令
  • 比较拥有相同数据类型的列;在比较中尽量比较数据类型一致的类,避免因数据精度缩放带来的时间损耗
  • 让索引列在比较表达式中单独出现;尽量将表达式或者函数调用的列单独处理,因为对列进行表达式计算处理时,MySQL将不会再使用索引
  • 不要再Like模式的开始位置就使用通配符
  • 多次测试不同的查询方法,选择较优的一个
  • 避免过多使用自动类型转换

选择利于高效查询的数据类型

  • 多用数字运算,少用字符串运算
  • 较小数据类型够用则不用大的数据类型
  • 数据列尽量声明为not null的

选择利于高效查询的表的存储格式:
高效加载数据:1)批量加载效率大于单行,如load data 和insert;2)load data 在没有local情况下效率更高;3)insert中values 后接多个元组与多次insert相比效率更高,总体耗时更短、需要索引的刷新次数更少。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值