mysql 学习

mysql的主要参数设置
1、innodb_buffer_pool_size:为了提升写性能,可以把药写的数据先在缓冲区里合并,然后再发送给下一级的存储,这样做可提高I/o操作的效率,Innodb buffer poo 就是Innodb用来缓存他的数据和索引的内存缓冲区,可有innodb_buffer_pool_size设置其大小,理论上这个值设置的越高,访问磁盘的I/O就越少。常见的做法是让这个值大于热点热点数据,这样就获取比较好的性能。
2、innodb_log_file_size:日志组每个日志文件的大小,建议将日志文件的大小设置为256MB或更大,可以满足一般情况下的需要。
mysql的开发基础
1、对于随机字符串,如md5、sha1、uuid生成的值会导致数据非常分散,没有明显的热点数据,还可能导致数据库缓存不能很好的工作,因此建议把md5、uuid之类的值再散列下,生成整型值。
选择合适的数据类型的一些原则
1、各表使用一致的数据类型
2、小往往更好,更短的类型意味着更少的磁盘空间、更少的内存空间、更少的cpu处理时间。
3、简单类型更好:建议使用mysql内建的类型来存储日志时间会更好,使用无符号整型来存储IP地址,可用INET_ATONO() INET_NTOA来执行转换
4、尽可能避免null值
索引的一些介绍
如果索引键值的逻辑顺序与索引所服务的表中相应行的物理顺序相同,那么该索引被称为簇索引,也称为聚集索引、聚簇索引也就说数据和索引在一起,记录被真实的保存在索引的叶子上,簇索引也称为索引组织表,反之为非聚簇索引,innodb表就是聚集索引。
索引的注意事项:
1、where条件中的索引列不能是表达式的一部分,mysql不支持函数索引
2、innodb的非主键索引存储的不是实际记录的指针,而是主键的值,所以主键最好是整型值,如自增id,基于主键存取数据是最高效的,使用二级索引存取数据则需要进行二次索引查找
3、最好是按主键的顺序导入数据,如果导入大量随机id的数据,那么可能需要运行optimize table命令来优化表
4、索引尽量是高选择性的,而且需要留意基数值,基数值指的是一个列中不同值的个数,显然,最大基数意味着该列中的每个值都是唯一的。还有一些特殊情况,由于数据分布很不均匀因此也会导致某些值的记录数很少,那么这种情况也适合创建索引加速查找这部分的数据。
5、使用更短的索引,可用考虑前缀索引,前缀索引仅索引前面一部分字符,但应确定所选择的前缀长度可以保证大部分的值是唯一的。
6、索引不宜太多。否则会造成空间的浪费且降低修改数据的速度
7、如果是唯一值的列,创建唯一索引会更佳,也可以确保不会出现重复数据
8、使用覆盖索引也可以大大提高性能,所谓覆盖索引是指所有数据都可以从索引中得到,而不需要去读取物理记录。使用覆盖索引也可以避免二次索引查找,如果extra列是using index 那就表示使用了覆盖索引
9、对于大量的数据排序速度将会很慢,尽量保证索引列和order by的列相同,且各列均按相同的方向排序。如果要连接多张表,那么order by引用的列将需要在表连接的顺序的首张表内。如果不满足以上条件,则不能利用索引进行排序,那么mysql将使用文件排序,文件排序是一个成本很高的操作,应尽量避免。利用索引来排序同样要遵循最左前缀的规则,前导列(等于确定值)加上排序列可以组合成最左前缀也行。
主键的注意事项
1、建议主键是整型
2、如果表中能包含一列能够确保唯一、非空、以及能够用来定位一条记录的字段,就不要因为传统而觉得一定要加上一个自增
3、主键也遵从索引的一些约定,注意联合主键的字段顺序
4、为主键选择更有意义的名称
Innodb的锁
1、数据库的锁定技术往往是基于索引来实现的,如果我们的sql语句里面没有利用到索引,那么innodb将会执行一个全表扫描,锁定所有的行
Innodb有几种不同类型的锁,
记录锁:这是一个索引记录锁,它是建立在索引记录上的锁,很多时候,扫描一个表,由于无索引,往往会导致整个表被锁住,建立合适的索引可以防止扫描整个表。
间隙锁:这个施加于索引记录间隙上的锁,
next-key锁:记录锁+间隙锁的组合,在insert的时候会锁住相邻的键,其实这是一个next-key锁技术,myql使用这个技术来避免幻读。
当同一查询在不同时间产生不同的结果集时,在事务内发生所谓的幻读,例如,如果select执行两次,但第二次返回第一次未返回的行,则该行就是幻影行,mysql默认是repeatable read,但更近一步,它使用next-key来防止发生幻读现象,在开发的时候当我们执行数据操作的机会,很有可能会导致间隙锁,由于间隙锁锁定的范围比较大,会导致可并发执行的事务受到限制,还有一点,next-key是为了防止发生幻读,而只有repeatable read及以上隔离级别才能防止幻读。
死锁:指两个及以上的事务在执行过程中因争夺资源而造成的一种互相等待的现象。
针对死锁的解决,通常如下的方法:
1、经常提交你的事务,小事务更少的倾向于冲突
2、以固定的顺序来访问表和行,这样事务就会形成定义良好的查询并且没有死锁
3、将精心选定的索引添加到表中
4、不要把无关的操作放在事务里
5、在并发比较高的系统中,不要显式加锁,特别是事务里加锁
6、尽量按主键/索引查找记录,范围查找增加了锁冲突的可能性,也不要利用数据库做一些额外的计算工作。
7、优化sql和表设计,减少同时占用太多资源的情况。
 
存储url地址一般推荐的做法就是对url值做一个散列,散列值最好是整型,然后存储这个散列值,并其上创建索引,散列函数可以用程序实现,减少myql的运算。
比如time33算法

原文地址:https://www.cnblogs.com/weiluoyan/p/9291324.html