《深入浅出MySql》笔记一

3.3 浮点数与定点数

CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
insert into test values(131072.32,131072.32);
select * from test;

在这里插入图片描述
c1 列的值由 131072.32 变成了 131072.31,书中介绍是浮点数的不精确性造成的。
在 mysql 中 float、double(或 real)是浮点数,decimal(或 numberic)是定点数。

浮点数和定点数的区别:

  • 浮点的小数位是可变的(随exponent变化),因此浮点数可表达的小数范围非常广。 定点数就是指在一个数中,整数部分和小数部分位数固定。详细链接

浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;
它的缺点是会引起精度问题。
在今后关于浮点数和定点数的应用中,大家要记住以下几点:
1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理。

**

索引:

**

  1. 搜索的索引列,不一定是所要选择的列。换句话说,最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列。
  2. 使用惟一索引。考虑某列中值的分布。对于惟一值的列,索引的效果最好,而具有多个重复值的列,其索引效果最差。例如,存放年龄的列具有不同值,很容易区分 各 行 。而用来记录性别的列,只含有“ M”和“F”,则对此列进行索引没有多大用处(不管搜索哪个值,都会得出大约一半的行)
  3. 使用短索引。如果对串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做 。例如,如果有一个 CHAR(200) 列,如果在前 10 个或 20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。对前 10 个或 20 个字符进行索引能够节省大量索引空间,也可能会使查询更快。较小的索引涉及的磁盘 I/O 较少,较短的值比较起来更快。更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,MySQL也可以在内存中容纳更多的值。这增加 了找到行而不用读取索引中较多块的可能性。(当然,应该利用一些常识。如仅用列值的第一个字符进行索引是不可能有多大好处的 ,因为这个索引中不会有许多不 同的值。)
  4. 利用最左前缀。在创建一个 n 列的索引时,实际是创建了 MySQL 可利用的 n 个索引。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。(这与索引一个列的前缀不同,索引一个列的前缀是利用该的前 n 个字符作为索引值。)
  5. 不要过度索引。不要以为索引“越多越好”,什么东西都用索引是错的。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能,这一点我们前面已经介绍 过。在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。如果有一个索引很少利用或从不使用,那么会不必要地减缓表 的修改速度。此外,MySQL 在生成一个执行计划时,要考虑各个索引,这也要费时间。创建多余的索引给查询优化带来了更多的工作。索引太多,也可能会使 MySQL 选择不到所要使用的最好索引。只保持所需的索引有利于查询优化。如果想给已索引的表增加索引,应该考虑所要增加的索引是否是现有多列索引的最左 索引。如果是,则就不要费力去增加这个索引了,因为已经有了。
  6. 考虑在列上进行的比较类型。索引可用于“ <”、“ < = ”、“ = ”、“ > =”、“ > ”和 BETWEEN 运算。在模式具有一个直接量前缀时,索引也用于 LIKE 运算。如果只将某个列用于其他类型的运算时(如 STRCMP( )),对其进行索引没有价值。

**

btree 索引与 hash 索引

btree
habtree
hash

hash

**
下列范围查询适用于 btree 索引和 hash 索引

SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20);

解释(个人理解):in的范围比较小,只有几个,hash还能接收这样程度
下列范围查询适用于 btree 索引

SELECT * FROM t1 WHERE key_col > 1 AND key_col < 10;
SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'bar' AND 'foo';

解释(个人理解):涉及到区间,因为区间可能很大,hash索引基本失效,因为hash只能说适合在一堆乱的里面快速找到一个,查找多个相当于多个查找速度为O(1)级别,总和为O(N)。这样就不适合hash了

SQL注入问题
prepareStatement 通过预编译sql语句解决

**

sql_mode

**
在这里插入图片描述
注意事项:
如果把 sql_mode 的值设置成后面的两个值(也就是我们说的严格模式),那么当在列 中插入或更新不正确的值时,mysql 将会给出错误,并且放弃 insert/update 操作。在我们的一般应用中建议使用这两种模式,而不是使用默认的空或 ANSI 模式。但是需要注意的问题是,如果数据库运行在严格模式下,并且你的存储引擎不支持事务,那么有数据不一致的风险存在,比如一组 sql 中有两个 dml 句,如果后面的一个出现了问题,但是前面的已经操作成功,那么 mysql 并不能回滚前面的操作。因此说设置 sql_mode 需要应用人员权衡各种得失,从而得到一个合适的选择。

SQL Mode 还可以实现对数据效验和转移等功能如:

  • ·效验日期数据合法性.
  • ·在 INSERT 或 UPDATE 过程中,如果被零除(或 MOD(X,0)),则产生错误
  • ·将‘"’视为识别符引号(‘`’引号字符) ·禁用反斜线字符(‘\’)做为字符串内的退出字符。启用
    NO_BACKSLASH_ESCAPES模式,反斜线则成为普通字符。
  • 将||视为字符串连接操作符(+)(同 CONCAT()),而不视为OR
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值