mysql 相关

mysql为什么建议字段not null?
1、null列需要多一个字节表示是否为null。
2、count(列)的时候,字段为null的行不会统计进来
3、如果字段不会作为条件查询、不会作为索引,为null是没有关系

 

选择的话,根据你需要的数据类型、锁级别、索引:

InnoDB有事务、行级锁。

InnoDB不支持FullText的全文索引,而MyISAM支持;

MyISAM有个数据总量值,所以 count 的时候,直接取这个,而InnoDB没有,但是如果count添加了where条件,那个值就用不到了。

MyIsam的表级锁很有意思,当使用update、delete等语句的时候,就锁了整个表而并发过来的insert,锁就不起作用,会添加到表末尾。适合做数据仓库select & insert,较少的update、delete等。它也没有事务。Myisam生太南了。

如果系统、项目、应用、模块规划的时候,就知道量(并发量)不会太大,考虑使用MyISAM试试??

关于联合索引:

select * from table where a=' ' and b=' ' and c=' ';

建立一个联合索引相当于建立了abc,ab,a这三个索引,所以必须要a有出现。如果出现了ac,那也只走了a的索引,里面的bc并没有利用到。afd等这种也是只走a索引。结构待定

如果只有c索引,且c为varchar,like ‘adb%’会走索引like具体值会走索引,但是like ‘%adb’这种匹配符前置的则不能走索引

聚簇索引与非聚簇索引,这个概念只在InnoDB的存储引擎才有。如果是其他索引,比如MyISAM就只有索引的概念并且都是聚簇索引,因为他们非常快,聚簇索引才合适他们,比如Merge引擎是MyISAM的组合。还有Memory,内存索引吧,速度快,没什么用。

聚簇索引:为数据的物理存储方式,通常以自增唯一id为primaryKey,数据库会由这个id生成聚簇索引。如果没有自增id,则会将某一列唯一值的作为聚簇索引(如果我们设置为primarykey)。如果连这一列都没有,那就数据库自己默认生成一个自增id,作为聚簇索引。可以这么认为,聚簇索引的数据节点就是数据!所以,一个表,只能有一个聚簇索引,而且是必有一个。

非聚簇索引:我们手动创建的所有唯一索引、联合(聚合)索引、前缀索引、全文索引等,都属于非聚簇索引。非聚簇索引数据节点存储的是系统的聚簇索引的标识,然后回表借助聚簇索引+标识,找到聚簇索引存储的数据。

(这里说的数据节点,如果是B+Tree,就是叶子节点)

1、为什么要自增id

曰:按照一个理论,取了一个数据,有很大的概率会取其上下附近的数据。所以从数据库读取数据的时候,是读取数据库的一页,自增id则可以保证每一页的数据都是按照顺序存储好的,来了新数据附加到后面就可以了(每一页之间不保证连续),如果一页满了就新开一页。如果按照乱序唯一的userId,第一个和第二个排好了,这时候加入了第三个,则要“插入”一二之间,增加了操作时间,更极端,134567已经满足了一页,这时候来了个2,则重开一页将7放入,且3456都要移动!二者顺序存储在InnoDB中是必须的,因为适合取范围,如果不取范围,用hash索引不是挺好么。

2、为什么非聚簇索引不存储数据地址

曰:非聚簇索引存储的是id,如存储了地址,比如X0777897等这种,太长了,众所周知一个表超过了700w就需要分表,如果是地址,则索引要维护的空间为地址长度*700w,如果是数字则需要维护1-7000000长度,远远小于地址长度。另一个原因就是,数据地址有可能会变,比如磁盘压缩、数据整理减少碎片等,如果出现了这种情况,那n个索引要维护n次地址,如果保存的是id的,那就只需要维护一次聚簇索引的地址就可以,其他的还是映射到id就行。一个非聚簇索引可能没什么影响,但是一个表通常很多个索引,那这个量就大了

3、hash索引与B+Tree区别

曰:a、B+Tree天然的按序存储适合范围查找、排序。b、如果有重复的key,hash容易冲突。c、hash不支持最左匹配原则

4、如上所述,利用非聚簇索引查询,非得有个回表才能查到数据吗

曰:不一定,有个概念叫做覆盖索引covering index,从索引里面能够取得值就不会再回表了。比如有个聚合索引(columA、columB)select columB from table t where columA = xx,那么在索引里面就可以得到columB的值,不需要回表。

5、联合索引的顺序应该如何定

曰:一般来说,sql查询次数越多的字段,就越放到索引前面。这是针对整个表的查询来说的,的确是这样,比如所有的查询都用到了ColumB,那么联合索引的第一个字段就必须是ColumB;如果针对一个查询语句,则不需要,乱序都可以,系统会进行语句优化。

6、索引是否有生效

曰:使用explain查看索引是否用到了,留意key_len字段的长度。int的key_len长度为4,如果可为null,则为5。bigint的key_len长度为8,如果可为null,则为9。varchar类型,utf8mb4长度为4,如果设置varchar为20,则key_len为20*4,如果可为null,则需要+1,因为是varchar类型,还要+2,如果换成了char,则为4*20+1。这个可以用来检测联合索引用,并验证最左匹配原则。

 

7、索引一定会生效吗

曰:不一定,如给性别Gendre建立索引,普通方法是通过gendre索引找到值,再回表。查询优化器会进行优化,因为重复值太多了,直接全表索引不走gendre索引。可以通过explain确认。如查找9,还得检索很长一段路程,还不如全表扫描。

这佳作选择性较低,就是数据列中不重复的数据比上总数据值太小,不宜建索引。但可以强制走索引

8、数据库隔离级别都有啥

曰:读未提交。读已提交。可重复读。串行化。越往后,数据越可靠,系统反应越慢。

    有AB两个线程。操作数据的流程是同一个事务内【修改、提交】。修改可入库,写了binlog,提交也入库,如果不提交,可以根据log回滚。

    A修改,未提交,B可以读取。如果A回滚,则B读取了脏数据,update、insert、delete

    A读取数据,操作,B修改提交,A再次读取,发现数据不一致出现了不可重复读 update了

    A事务时间很长,A读取总数为10条,B此时插入,A同一个事务内再次读取发现11条,A在同一个事务数据不一致,就出现了幻读 insert delete了。 

    这里说的,都是A的事务很长做了很多事情。B很短,在A事务内进行了操作。

读未提交:脏数据、不可重复读、幻读。

读已提交:不可重复读、幻读。

可重复读:幻读。

串行读:数据完美。

set tx_isolatioin='value';  value: read-uncommitted、read-committed、repeatable-read、serializable

select @@tx_isolation;   查看当前数据库的事务类型

 

9、ip地址怎么存储,不用inet_aton、inet_ntoa函数

原理:

实现:

另一种方法,速度更快 

还有一种,分四列存储。

可不可以*256?不*1000?

另外,inet_aton、inet_ntoa是C语言的底层函数,mysql数据库也借鉴了。

10、某些验证

mysql查询每次只能使用一个索引

#只有一个索引。like具体值,走索引。%前缀不走索引,%后缀走索引
EXPLAIN select * from invoice_order_collection_0 where  UPDATE_EMP like 'sdf%'

11、FullText索引

全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。---来自自媒体网页

此索引只有MyISAN存储引擎才有。使用方法与普通的like不同,使用的是select * from table where match('title') against('Les Misérables'),原生mysql对英文支持很好,对中文需要添加插件Sphinx(斯芬克斯)/Coreseek等。

 

事务的四种实现方式:

1编程式事务。需要在代码里面commit(), rollback()等,代码侵入太大,几乎已经不用了。

2事务代理工厂的配置方法TransactionProxyFactoryBean。这种需要在xml里面配置隔离级别等,以前比较常见

3注解的方法。@Transaction,简单。

4

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值