StephenChan's Tech Space 潜心修炼

28Apr/100

MySQL索引基础

看完《High Performance MySQL》前三章了,本来是计划上周总结一下的,但是硬要拖到现在。虽然只比《深入浅出MySQL》多了20+RMB,但是技术含量高太多了。前面三章讲的内容都算是比较琐碎和基础,第二章介绍的基准测试和性能分析工具有时间要去用一下。前两天还想着不总结的,因为都比较基础,但是这两天review了一下,有一些有意思的东西我觉得还是要写下来好点,不能给自己太懒。

MyISAM的索引是直接指向存储的数据行的物理位置,而InnoDB则是指向primary key,即是对于InnoDB而言,Key 'im_a_index' (id)这样的索引,其索引的数据里面指向的不是数据行的物理位置,而是数据行的primary key,因此使用索引查询其实会产生两次查询,首先是在索引里面获取查询数据的primary key,然后再通过primary key查询到真正的数据。因此,也出现了一个概念叫"Covering Index",这个不是什么新鲜的概念," An index that contains (or covers) all the data needed to satisfy a query is called a covering index. ",正是由于InnoDB要二次查询数据行的原因,covering index就让所有使用这个索引查询的数据都放在索引里面,对于"select * from table_name where ..."这些要获取所有列的数据,那么就肯定会用不上这个covering index的好处了。当然,covering index也并不是鼓励所有的查询都新建一个index来体验covering index的好处,太多的index不但会使索引占用的容量增大难以维护,而且也会使update、delete、insert的成本提高很多,具体还是要看项目数据的需求而定,何况,一个数据访问量不大的小项目,就觉得没有什么必要了。对于B-Tree索引,应用索引除了要遵循leftmost prefix之外,在第一个range condition后面的列都不会应用到索引的,其实也就是索引会匹配这样的(equality, equality, range)这样的条件,但是在(equality, equality, range, equality, range..)这样的条件下,在第一个range后面的都不会享受到index的待遇。

Filed under: MySQL Continue reading
30Jan/100

ibbackup备份与恢复

1.备份

ibbackup备份的基本命令:

#ibbackup 传入两个配置文件的路径参数
ibbackup /path/to/my.cnf /path/to/my2.cnf
#典型的:
ibbackup /etc/my.cnf /home/mysql/backup-my.cnf

ibbackup会根据第一个参数中的my.cnf文件,获取需要备份的InnoDB的数据文件ibdata和日志文件ib_logfile的位置,并将其备份到第二个参数my2.cnf所指定的位置,ibbackup将读取第一个参数my.cnf中的如下内容:

datadir=...
innodb_data_home_dir=...
innodb_data_file_path=...
innodb_log_group_home_dir=...
innodb_log_files_in_group=...
innodb_log_file_size=...
#这里需要注意的是,很多的配置文件 my.cnf 中是没有 innodb_log_group_home_dir 和innodb_data_home_dir,这样ibbackup 会执行失败。

在第二个配置文件my2.cnf中的datadir、innodb_data_home_dir和innodb_log_group_home_dir是填写备份的目录,而且这些目录是要填写绝对路径的,因为ibbackup不识别这些文件中填写的相对路径。两个配置文件my.cnf和my2.cnf中关于数据文件的数量和大小设置必须相同,包括autoextend参数也要保持一致,而日志文件则可以不一样。

Filed under: MySQL Continue reading
4Jan/100

《深入浅出MySQL》读书拾遗-管理维护

  1. MySQL常用工具
    • "default-character-set"这个选项作为服务器字符集选项,可以在my.cnf的[mysqld]组中配置,也可以在my.cnf的[mysql]组中配置,并且可以在mysql的命令行中手工指定客户端字符集"mysql -u user --default-character-set=charset"。
    • 在命令行中"-e(--execute=)"选项可以直接执行MySQL脚本,而不用连接到MySQL数据库后再执行。可以按这种方式连续执行多个SQL语句,用英文分号(;)隔开,"mysql -u root -p -e 'select * from t1;select count(*) from t2'"。
    • 命令行中的"-E"选项类似于mysql里面执行SQL语句后加"\G"来进行格式化输出。
    • 还有几个错误处理选项,"-f(--force)"表示强制执行SQL,"-v(--verbose)"显示更多信息,"--show-warnings"显示警告信息。
    • myisampack(MyISAM表压缩工具)可以使用很高的压缩率来对MyISAM存储引擎的表进行压缩,使用压缩后的表占用比压缩前小得多的磁盘空间。但是压缩后的表也将成为一个只读表,不能进行DML操作。
    • mysqlbinlog(日志管理工具)可以检查由服务器生成的二进制日志,其中--start-datetime/position、--stop-datetime/position可以查看指定日期间隔或者位置间隔内的所有日志。
    • mysqlcheck(MyISAM表维护工具)可以检查和修复MyISAM表,还可以优化和分析表。实际上,它集成了mysql工具中check、repair、analyze、optimize的功能。
    • mysqldump(数据导出工具)用来备份数据库或在不同数据库之间进行数据迁移。备份内容包含创建表或装载表的SQL语句。mysqldump目前是MySQL中最常用和备份工具。
    • mysqlhotcopy(MyISAM表热备份工具)是一个Perl脚本,它使用了LOCK TABLES、FLUSH TABLES、cp或scp来快速备份数据库。它是备份数据库或单个表的最快途径,其缺点是mysqlhotcopy只用于备份MyISAM,而且它需要运行在Linux/Unix环境中。
    • mysqlimport(数据导入工具)是客户端数据导入工具,用来导入mysqldump加-T选项后导出的文本文件。它实际上是客户端提供了LOAD DATA INFILE语句的一个命令行接口。
    • mysqlshow(数据库对象查看工具)客户端对象查找工具,用来很快地查找哪些数据库、数据库中的表、表中的列或索引。其使用方法如下:mysqlshow [-u|-p] [dbname] [table] [col] --count(显示统计信息)/-k(-keys,显示指定表的所有索引)/-i(-status,显示表的一些状态信息)
    • perror(错误代码查看工具)是用来解释数据库中一些错误代码的详细含义的,"perror 30 60"是查看错误号30和60分别指什么错误。
Filed under: MySQL Continue reading
29Dec/090

《深入浅出MySQL》读书拾遗-优化

  • 在MySQL中,数据库对应操作系统下的数据目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,这取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。
  • 列、索引、存储子程序和触发器名在任何平台上对大小写不敏感。默认情况下,表别名在UNIX中对大小写敏感,但在Windows或Mac OS X中对大小写不敏感。在MySQL中如何在硬盘上保存、使用表名和数据库名由lower_case_tables_name系统变量决定,可以在启动mysqld时设置这个系统变量。
  • MySQL客户端连接成功后,通过show [session|global] status命令可以提供服务器状态信息,也可以在操作系统上使用mysqladmin extended-status命令获得这些消息。
  • "show status like 'Com_%s';"可以显示当前session中所有统计参数的值。其中Com_xxx表示每个xxx语句执行的次数,如Com_select(执行select操作的次数,一次查询只累加1)、Com_insert(执行insert操作的次数,对于批量插入的insert操作,只累加一次),还有Com_update/Com_delete/Innodb_rows_read/Innodb_rows_inserted/Innodb_rows_updated/Innodb_rows_deleted等等,通过这些参数可以了解到当前数据库的应用是以插入更新为主还是以查询操作为主,以及各种类型的SQL大致的执行比例是多少。
  • 对于事务型的应用,通过Com_commit和Com_rollback可以了解事务提交和回滚的情况,对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。
  • Connections(试图连接MySQL服务器的次数),Uptime(服务器工作时间),Slow_queries(慢查询的次数)这三个参数也可以帮助用户了解数据库的基本情况。
  • 通过慢查询日志定位那些执行效率较低的SQL语句,用--log-slow-queries=[file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。
  • 通过show processlist命令可以查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看SQL的执行情况,同时对一些锁表操作进行优化。
  • 通过explain分析低效的SQL的执行计划
  • MySQL中索引的存储类型目前只有支持两种,具体和表的存储引擎相关:MyISAM和InnoDB存储引擎都只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
  • 查询要使用索引最主要的条件是查询条件需要使用索引关键字,如果是多列索引,那么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。
Filed under: MySQL Continue reading
23Dec/090

《深入浅出MySQL》读书拾遗-基础开发

一、    MySQL入门

  1. DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括create、drop、alter等。
  2. DML(Data Manipulation Languages)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据库完整性。常用的语句关键字主要包括insert、delete、update和select等。
  3. DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。
  4. change和modify都可以修改表的定义,不同的是change后面需要写两次列名,不方便。但是change的优点是可以修改列名称,modify则不能。
Filed under: MySQL Continue reading