行业新闻 网站公告

Mysql学习笔记

来源:作者:JAVA分享网

1.对于varchar类型的列,存储同样的字符串的空间开销是一样的,为什么使用更短的列有优势?
    更长的列会消耗更多的内存,因为Mysql通常会分配固定大小的内存块来保存内部值,尤其是使用内存临时表进行排序或操作时,还有在利用磁盘临时表进行排序时同样糟糕
2.重新设置数字类型的主键自增值
    alter table users AUTO_INCREMENT=1;
3.sql_mode的相关设置
    ONLY_FULL_GROUP_BY
    对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
    NO_AUTO_VALUE_ON_ZERO
    该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了
    STRICT_TRANS_TABLES
    在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
    NO_ZERO_IN_DATE
    在严格模式下,不允许日期和月份为零
    NO_ZERO_DATE
    设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
    ERROR_FOR_DIVISION_BY_ZERO
    在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL
    NO_AUTO_CREATE_USER
    禁止GRANT创建密码为空的用户
    PIPES_AS_CONCAT
    将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
    ANSI_QUOTES
    启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
   SQL_MODEL具体详见Mysql官方文档http://dev.mysql.com/doc/refman/5.5/en/sql-mode.html
Mysql分页方式
普通limit M,N的翻页写法,往往在越往后翻页的过程中速度越慢,原因 mysql会读取表中的前M+N条数据,M越大,性能就越差:
select  *  from t where sellerid=100 limit 100000,20 优化写法: select t1.* from  t t1, (select id from t  sellerid=100 limit 100000,20) t2 where t1.id=t2.id; 优化后的翻页写法,先查询翻页中需要的N条数据的主键id,在根据主键id回表查询所需要的N条数据,此过程中查询N条数据的主键ID在索引中完成
这种优化的根本出发点,是减少在数据页中的扫描量
覆盖索引,也是一种优化思路,出发点就是直接从二级索引中直接获取查询结果。
Mysql字符集
只有基于字符的值才真正的有字符集的概念,对于其他类型,字符集只是一个设置,指定用哪一种字符集来做比较或者其他的操作。基于字符的值能存放在某列中、查询的字符串。表达式的计算结果中或者某个用户变量中等。
mysql字符集的继承关系:数据库字符集–>表字符集–>列字符集最终的影响是列的字符集,那是真正存放数据的地方,所以更高层次的设置只是指定默认值。一个表的默认的字符集设置无法影响存储在这个表中某个列的值,只有当创建列而没有对该列指定字符集的时候,才会使用上层设置的字符集。