??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品无码不卡在线播HE ,亚洲精品成人av在线,亚洲性色成人av天堂http://www.tkk7.com/persister/category/46174.htmlzh-cnWed, 13 Oct 2010 21:33:30 GMTWed, 13 Oct 2010 21:33:30 GMT60MySQL导入导入命oȝhttp://www.tkk7.com/persister/archive/2010/07/14/326107.htmlpersisterpersisterWed, 14 Jul 2010 09:52:00 GMThttp://www.tkk7.com/persister/archive/2010/07/14/326107.htmlhttp://www.tkk7.com/persister/comments/326107.htmlhttp://www.tkk7.com/persister/archive/2010/07/14/326107.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/326107.htmlhttp://www.tkk7.com/persister/services/trackbacks/326107.html
基本分ؓ两种形式Q一U是sql形式的数据导入导?mysqldump,mysql,source)Q另一U是自定义数据的导入导出(load data infile, into outfile)?br />
自定义数据格式的导入导出有一个好处就是数据可以是csv格式的,而且用的非常多。比如大型的数据Q如果往查询到数据然后写到excel里面Q效率肯定是一个问题。但是用mysql的自带的命oQ那么就可以让mysql自己生成csv文gQ这样速度会快不少。导入也是一P是数据文g可以传到服务器上Q然后用mysql的命令导入到数据库中Q比读csv格式的文件然后插入到数据库中效率会提高不?br />

下面附上q些命o的具体描qͼ

mysql中Load Data InFile是用于批量向数据表中导入记录?br /> 首先创徏一个表
Use Test;
Create Table TableTest(
`ID` mediumint(8) default '0',
`Name` varchar(100) default ''
) TYPE=MyISAM;

向数据表导入数据
Load Data InFile 'D:/Data.txt' Into Table `TableTest`

常用如下Q?br /> Load Data InFile 'D:/Data.txt' Into Table `TableTest` Lines Terminated By '"r"n';
q个语句Q字D默认用制表W隔开Q每条记录用换行W隔开Q在Windows下换行符?#8220;"r"n”
D:/Data.txt 文g内容如下面两行:
1 A
2 B
“1”?#8220;A”之间有一个制表符
q样导q两条记录了?br />
自定义语?br /> Load Data InFile 'D:/Data.txt' Into Table `TableTest` Fields Terminated By ',' Enclosed By '"'

Escaped By '"' Lines Terminated By '"r"n';
Fields Terminated By ',' Enclosed By '"' Escaped By '"'
表示每个字段用逗号分开Q内容包含在双引号内
Lines Terminated By '"r"n';
表示每条数据用换行符分开


导入数据?br /> 常用source 命o
q入mysql数据库控制台Q?br /> 如mysql -u root -p

mysql>use 数据?br />
然后使用source命oQ后面参Cؓ脚本文gQ如q里用到?sqlQ?br /> mysql>source d:"wcnc_db.sql

也可以用mysql命oQ在bin目录下)
.../bin/mysql db1 > xx.sql;


?Load Data InFile 相反的是
Select * From `TableTest` Into OutFile 'D:/Data_OutFile.txt';
把表的数据导?br />

Using command line tools to export data from a MySQL database into a CSV file is quite easy. Here's

how:

mysql -uexampleuser -pletmein exampledb -B -e "select * from "`person"`;" | sed 's/

"t/","/g;s/^/"/;s/$/"/;s/"n//g' > filename.csv

Here is some sample output of the above:

"id","username","group","password"
"1","tux","admin","5f4dcc3b5aa765d61d8327deb882cf99"
"2","tlugian","admin","5f4dcc3b5aa765d61d8327deb882cf99"
"3","saiyuki","admin","5f4dcc3b5aa765d61d8327deb882cf99"
"4","fred","staff","5f4dcc3b5aa765d61d8327deb882cf99"
"5","barney","staff","5f4dcc3b5aa765d61d8327deb882cf99"
"6","wilma","admin","5f4dcc3b5aa765d61d8327deb882cf99"

And now for the explanation:

Starting with the MySQL command. I wont explain the -u and -p options they are straight forward (if

in doubt man mysql). The -B option will delimit the data using tabs and each row will appear on a

new line. The -e option denotes the command to run once you have logged into the database. In this

case we are using a simple SELECT statement.

Onto sed. The command used here contains three seperate sed scripts:

s/"t/","/g;s/^/"/        <--- this will search and replace all occurences of 'tabs' and replace them

with a ",".

;s/$/"/;    <--- This will place a " at the start of the line.

s/"n//g    <---- This will place a " at the end of the line.

After running the result set through sed we redirect the output to a file with a .csv extension.



mysqldump命o的输入是在bin目录?
1.导出整个数据?br />
mysqldump -u 用户?-p 数据库名 > 导出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

2.导出一个表

mysqldump -u 用户?-p 数据库名 表名> 导出文g的\径和名称

mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql






persister 2010-07-14 17:52 发表评论
]]>
MySQL Show processlist命o功能http://www.tkk7.com/persister/archive/2010/07/13/325975.htmlpersisterpersisterTue, 13 Jul 2010 08:15:00 GMThttp://www.tkk7.com/persister/archive/2010/07/13/325975.htmlhttp://www.tkk7.com/persister/comments/325975.htmlhttp://www.tkk7.com/persister/archive/2010/07/13/325975.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/325975.htmlhttp://www.tkk7.com/persister/services/trackbacks/325975.html
show processlist

mysql> show processlist;
+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------
| Id | User  | Host            | db   | Command | Time| State     | Info                                                                                          
+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------
|207|root  |192.168.0.20:51718 |mytest | Sleep    | 5    |         | NULL                                                                                                
|208|root  |192.168.0.20:51719 |mytest | Sleep    | 5    |         | NULL       
|220|root  |192.168.0.20:51731 |mytest |Query    | 84   | Locked  |
select bookname,culture,value,type  from book where id=001
先简单说一下各列的含义和用途,W一列,idQ不用说了吧Q一个标识,你要kill一个语句的时候很有用Q比如我们进行了一个非常耗时的查询,惛_止的时候,只有采用这个命令了?br />
user列,昄当前用户Q如果不是rootQ这个命令就只显CZ权限范围内的sql语句?br />
host列,昄q个语句是从哪个ip的哪个端口上发出的,可以用来q踪出问题语句的用户?br />
db列,昄q个q程目前q接的是哪个数据库?br />
command列,昄当前q接的执行的命oQ一般就是休眠(sleepQ,查询 QqueryQ,q接QconnectQ。time列,此这个状态持l的旉Q单位是U?br />
state列,昄使用当前q接的sql语句的状态,很重要的列,后箋会有所有的状态的描述Q请注意Qstate只是语句执行中的某一个状态,一个sql语句Q已查询ZQ可能需要经qcopying to tmp tableQSorting resultQSending data{状态才可以完成Qinfo列,昄q个sql语句
?br />
注意权限Q通常只能看到自己的查询processQ是看不到其他h的process的?br />




persister 2010-07-13 16:15 发表评论
]]>
MySQL忘记root密码怎么办?http://www.tkk7.com/persister/archive/2010/03/24/316461.htmlpersisterpersisterWed, 24 Mar 2010 09:26:00 GMThttp://www.tkk7.com/persister/archive/2010/03/24/316461.htmlhttp://www.tkk7.com/persister/comments/316461.htmlhttp://www.tkk7.com/persister/archive/2010/03/24/316461.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/316461.htmlhttp://www.tkk7.com/persister/services/trackbacks/316461.html 启动 MySQLQmysqld --skip-grant-tablesQ?br /> 可以不需要密码就q入 MySQL 了?
然后是
>use mysql
>update user set password=password("new_pass") where user="root";
>flush privileges;
重新杀 MySQL Q用正常Ҏ启动 MySQL ?br />
q里有一个地方要注意Q就是有可能Quser表中Ҏ没有rootq个用户?br />

persister 2010-03-24 17:26 发表评论
]]>
MYSQL Master-Slave配置和实现原?/title><link>http://www.tkk7.com/persister/archive/2009/09/09/294507.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Wed, 09 Sep 2009 12:37:00 GMT</pubDate><guid>http://www.tkk7.com/persister/archive/2009/09/09/294507.html</guid><wfw:comment>http://www.tkk7.com/persister/comments/294507.html</wfw:comment><comments>http://www.tkk7.com/persister/archive/2009/09/09/294507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/persister/comments/commentRss/294507.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/persister/services/trackbacks/294507.html</trackback:ping><description><![CDATA[The target uses for replication in MySQL include: <br /> <ul> <li> <p> Scale-out solutions - spreading the load among multiple slaves to improve performance. In this environment, all writes and updates must take place on the master server. Reads, however, may take place on one or more slaves. This model can improve the performance of writes (since the master is dedicated to updates), while dramatically increasing read speed across an increasing number of slaves. </p> </li> <li> <p> Data security - because data is replicated to the slave, and the slave can pause the replication process, it is possible to run backup services on the slave without corrupting the corresponding master data. </p> </li> <li> <p> Analytics - live data can be created on the master, while the analysis of the information can take place on the slave without affecting the performance of the master. </p> </li> <li> <p> Long-distance data distribution - if a branch office would like to work with a copy of your main data, you can use replication to create a local copy of the data for their use without requiring permanent access to the master?br /> </p> </li> </ul> 配置参考mysql<a >官方文档</a>Q按照配|文档,我具体测试了一下,没有问题Q大概的配置步骤如下Q?br /> <br /> <br /> <strong><br /> 1、Master端的my.cnf配置</strong><br /> <div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: rgb(0, 0, 255);">log</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">bin<br /> server</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">id</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br /> sql</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">bin</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">update</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">same<br /> binlog</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">db</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">vbb</span></div> <br /> <strong>2、Slave端的my.cnf配置</strong><br /> <div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: rgb(0, 0, 0);">master</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">host</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">192.168</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">22.25</span><span style="color: rgb(0, 0, 0);"><br /> master</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">user</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">salve<br /> master</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">password</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">123456</span><span style="color: rgb(0, 0, 0);"><br /> master</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">port</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">3306</span><span style="color: rgb(0, 0, 0);"><br /> server</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">id</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);"><br /> master</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">connect</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">retry</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">60</span><span style="color: rgb(0, 0, 0);"> 预设重试间隔60U?/span></div> <br /> <strong>3、复?/strong><br /> <div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: rgb(0, 0, 0);">CHANGE MASTER to </span><span style="color: rgb(0, 0, 0);">MASTER_LOG_FILE</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">mysql-bin.000006</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> MASTER_LOG_POS</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 0);">98</span></div> <br /> 具体配置有一些细节,看官Ҏ档即可?br /> <br /> q里具体说一下其原理Q?br /> <br /> <p><font face="Times New Roman"><strong>1、复制进E?/strong><br /> Mysql的复ӞReplicationQ是一个异步的复制Q从一个Mysql instaceQ称之ؓMasterQ复制到另一个Mysql instanceQ称之SlaveQ。实现整个复制操作主要由三个q程完成的,其中两个q程在SlaveQSqlq程和IOq程Q,另外一个进E在 MasterQIOq程Q上?br /> 要实施复Ӟ首先必须打开Master端的binary logQbin-logQ功能,否则无法实现。因为整个复制过E实际上是Slave从Master端获取该日志然后再在自己w上完全序的执行日志中所记录的各U操作?br /> 复制的基本过E如下:<br /> 1)、Slave上面的IOq程q接上MasterQƈh从指定日志文件的指定位置Q或者从最开始的日志Q之后的日志内容Q?br /> </font><font face="Times New Roman"><br /> 2)、Master接收到来自Slave的IOq程的请求后Q通过负责复制的IOq程Ҏh信息d制定日志指定位置之后的日志信息,q回lSlave 的IOq程。返回信息中除了日志所包含的信息之外,q包括本ơ返回的信息已经到Master端的bin-log文g的名UC及bin-log的位|;<br /> <br /> 3)、Slave的IOq程接收C息后Q将接收到的日志内容依次d到Slave端的relay-log文g的最末端Qƈ读取到的Master端的 bin-log的文件名和位|记录到master-info文g中,以便在下一ơ读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位|开始往后的日志内容Q请发给?#8221;Q?br /> <br /> 4)、Slave的Sqlq程到relay-log中新增加了内容后Q会马上解析relay-log的内Ҏ为在Master端真实执行时候的那些可执行的内容Qƈ在自w执行?br /> 实际上在老版本的Mysql的复制实现在Slave端ƈ不是两个q程完成的,而是׃个进E完成。但是后来发现这样做存在较大的风险和性能问题Q主要如下:<br /> 首先Q一个进E就使复制bin-log日志和解析日志ƈ在自w执行的q程成ؓ一个串行的q程Q性能受到了一定的限制Q异步复制的延迟也会比较ѝ?br /> 另外QSlave端从Master端获取bin-logq来之后Q需要接着解析日志内容Q然后在自n执行。在q个q程中,Master端可能又产生了大? 变化q声UC大量的日志。如果在q个阶段Master端的存储出现了无法修复的错误Q那么在q个阶段所产生的所有变更都永q无法找回。如果在Slave 端的压力比较大的时候,q个q程的时间可能会比较ѝ?br /> 所以,后面版本的MysqlZ解决q个风险q提高复制的性能Q将Slave端的复制改ؓ两个q程来完成。提个改q方案的人是Yahoo!的一位工E? ?#8220;Jeremy Zawodny”。这h解决了性能问题Q又~短了异步的延时旉Q同时也减少了可能存在的数据丢失量。当Ӟ即是换成了现在q样两个U程处理以后Q同 样也q是存在slave数据延时以及数据丢失的可能性的Q毕竟这个复制是异步的。只要数据的更改不是在一个事物中Q这些问题都是会存在的。如果要完全避免 q些问题Q就只能用mysql的cluster来解决了。不qmysql的cluster是内存数据库的解x案,需要将所有数据都load到内存中Q这 样就对内存的要求非常大了,对于一般的应用来说可实施性不是太大?br /> </font></p> <p><font face="Times New Roman"><strong>2、复制实现?/strong><br /> Mysql的复制可以是Z一条语句(Statement levelQ,也可以是Z一条记录(Row levelQ,可以在Mysql的配|参C讑֮q个复制U别Q不同复制别的讄会媄响到Master端的bin-log记录成不同的形式?br /> Row LevelQ日志中会记录成每一行数据被修改的Ş式,然后在slave端再对相同的数据q行修改?br /> 优点Q在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以row level的日志内容会非常清楚的记录下每一行数据修改的l节Q非常容易理解。而且不会出现某些特定情况下的存储q程Q或functionQ以? trigger的调用和触发无法被正复制的问题?br /> ~点Qrow level下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,q样可能会生大量的日志内容Q比如有q样一条update? 句:update product set owner_member_id = ‘b’ where owner_member_id = ‘a’Q执行之后,日志中记录的不是q条update语句所对应额事Ӟmysql以事件的形式来记录bin-log日志Q,而是q条语句所更新的每一? 记录的变化情况,q样p录成很多条记录被更新的很多个事g。自Ӟbin-log日志的量׃很大。尤其是当执行alter table之类的语句的时候,产生的日志量是惊人的。因为Mysql对于alter table之类的表l构变更语句的处理方式是整个表的每一条记录都需要变动,实际上就是重Z整个表。那么该表的每一条记录都会被记录到日志中?br /> Statement Level:每一条会修改数据的sql都会记录?master的bin-log中。slave在复制的时候sqlq程会解析成和原来master端执行过的相同的sql来再ơ执行?br /> 优点Qstatement level下的优点首先是解决了row level下的~点Q不需要记录每一行数据的变化Q减bin-log日志量,节约IOQ提高性能。因Z只需要记录在Master上所执行的语句的l节Q以及执行语句时候的上下文的信息?br /> ~点Q由于他是记录的执行语句Q所以,Z让这些语句在slave端也能正执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文? 息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的l果。另外就是,׃Mysql现在发展比较快,很多的新功能? 断的加入Qmysql得复刉C不小的挑战,自然复制的时候涉及到复杂的内容Qbug也就容易出现。在statement level下,目前已经发现的就有不情况会造成mysql的复制出现问题,主要是修Ҏ据的时候用了某些特定的函数或者功能的时候会出现Q比 如:sleep()函数在有些版本中׃能真复Ӟ在存储过E中使用了last_insert_id()函数Q可能会使slave和master上得? 不一致的id{等。由于row level是基于每一行来记录的变化,所以不会出现类似的问题?/font></p> <p>With statement-based replication, you may encounter issues with replicating stored routines or triggers. You can avoid these issues by using row-based replication instead.</p> <p><font face="Times New Roman"> 从官Ҏ档中看到Q之前的Mysql一直都只有Zstatement的复制模式,直到5.1.5版本的Mysql才开始支持row level的复制。从5.0开始,Mysql的复制已l解决了大量老版本中出现的无法正复制的问题。但是由于存储过E的出现Q给Mysql的复制又带来 了更大的新挑战。另外,看到官方文档_?.1.8版本开始,Mysql提供了除Statement Level和Row Level之外的第三种复制模式QMixedQ实际上是前两U模式的l合?/font></p> <p>From MySQL 5.1.12 to MySQL 5.1.28, mixed format is the default. Beginning with MySQL 5.1.29, statement-based format is the default. </p> <p><font face="Times New Roman">在Mixed模式下,Mysql会根据执行的每一条具体的sql语句来区分对 待记录的日志形式Q也是在Statement和Row之间选择一U。新版本中的Statment levelq是和以前一P仅仅记录执行的语句。而新版本的Mysql中队row level模式也被做了优化Qƈ不是所有的修改都会以row level来记录,像遇到表l构变更的时候就会以statement模式来记录,如果sql语句实是update或者delete{修Ҏ据的语句Q? 那么q是会记录所有行的变更?br /> </font></p> <font face="Times New Roman"><strong>3、复制常用架?/strong><br /> Mysql复制环境90%以上都是一个Master带一个或者多个Slave的架构模式,主要用于d力比较大的应用的数据库端廉h扩展解决Ҏ。因为只 要master和slave的压力不是太大(其是slave端压力)的话Q异步复制的延时一般都很少很少。尤其是自slave端的复制方式Ҏ两个q程 处理之后Q更是减了slave端的延时。而带来的效益是,对于数据实时性要求不是特别的敏感度的应用Q只需要通过廉h的pc server来扩展slave的数量,读压力分散到多台slave的机器上面,卛_解决数据库端的读压力瓉。这在很大程度上解决了目前很多中型|站 的数据库压力瓉问题Q甚x些大型网站也在用类似方案解x据库瓉?br /> 一个Master带多个slave的架构实施非常简单,多个slave和单个slave的实施ƈ没有太大区别。在Master端ƈ不care有多个 slaveq上了master端,只要有slaveq程通过了连接认证,向他hbinlog信息Q他׃按照q接上来的ioq程的要求,d自己? binlog信息Q返回给slave的IOq程。对于slave的配|细节,在Mysql的官Ҏ档上面已l说的很清楚了,甚至介绍了多U实现slave 的配|方法?/font><br /> <img src ="http://www.tkk7.com/persister/aggbug/294507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/persister/" target="_blank">persister</a> 2009-09-09 20:37 <a href="http://www.tkk7.com/persister/archive/2009/09/09/294507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL Indexhttp://www.tkk7.com/persister/archive/2009/08/20/291923.htmlpersisterpersisterThu, 20 Aug 2009 03:37:00 GMThttp://www.tkk7.com/persister/archive/2009/08/20/291923.htmlhttp://www.tkk7.com/persister/comments/291923.htmlhttp://www.tkk7.com/persister/archive/2009/08/20/291923.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/291923.htmlhttp://www.tkk7.com/persister/services/trackbacks/291923.htmlq篇文章摘自|络Q已l找不到原文出处了,写的不错Q学习一下?br />
数据库的索引

1. 如果不徏立烦引,那么查询都需要全表扫描;如果建立了烦引,则数据库会保存一个烦引文仉常是特D的l构比如B树,q样查询h不需要全表扫描,一下子能够扑ֈ满要求的记录?/span>

2. 一般是?/span>Where之后的条件徏立烦引,数据库中的主键是已经建立了烦引的。数据库中可以徏立多个烦引?/span>

 

3. 可以对不同类型的列徏立烦引?/span>

对于Textcd{,可以使用MySQL的全文检索功能徏立全文烦引。它利用了自然语a的方法去在文本中索关键词?/span>

举个例子Q如果?/span>=L话可能需要?/span>like以及%{去匚w。而?/span>MySQL的全文检索可以?/span>Match函数卛_索出包含关键词的列?/span>

详细情况参看MySQL参考手册关于全文检索的部分?/span>

 

4.1使用索引

    我们首先讨论索引Q因为它是加快查询的最重要的工兗还有其他加快查询的技术,但是最有效的莫q于恰当C用烦引了。在MySQL的邮件清单上Qh们通常询问关于使查询更快的问题。在大量的案例中Q都是因上没有烦引,一般只要加上烦引就可以立即解决问题。但q样也ƈ非L有效Q因Z化ƈ非L那样单。然而,如果不用烦引,在许多情形下Q用其他手段改善性能只会是浪Ҏ间。应该首先考虑使用索引取得最大的性能改善Q然后再L其他可能有帮助的技术?/span>

    本节介绍索引是什么、它怎样改善查询性能、烦引在什么情况下可能会降低性能Q以及怎样选择索引。下一节,我们讨?/span>MySQL的查询优化程序。除了知道怎样创徏索引外,了解一些优化程序的知识也是有好处的Q因样可以更好地利用所创徏的烦引。某些编写查询的Ҏ实际上会妨碍索引的效果,应该避免q种情况出现。(虽然qMq样。有时也会希望忽略优化程序的作用。我们也介l这些情c)

    4.1.1索引的益?/span>

    让我们从一个无索引的表着手来考察索引是怎样起作用的。无索引的表是一个无序的行集。例如,?/span>4 - 1l出了我们在W?/span>1?#8220;MySQL?/span>SQL 介绍” 中首先看到的ad 表。这个表上没有烦引,因此如果我们查找某个特定公司的行Ӟ必须查看表中的每一行,看它是否与所需的值匹配。这是一个全表扫描,很慢Q如果表中只有少数几个记录与搜烦条g相匹配,则其效率是相当低的?/span>

                             

    ?/span>4 - 2l出了相同的表,但在表的company_num 列上增加了一个烦引。此索引包含表中每行的一,但此索引是在company_num 上排序的。现在,不需要逐行搜烦全表查找匚w的条ƾ,而是可以利用索引q行查找。假如我们要查找公司13的所有行Q那么可以扫描烦引,l果得出3行。然后到辑օ?/span>14的行Q这是一个比我们正在查找的要大的L。烦引值是排序的,因此在读到包?/span>14的记录时Q我们知道不会再有匹配的记录Q可以退Z。如果查找一个|它在索引表中某个中间点以前不会出玎ͼ那么也有扑ֈ其第一个匹配烦引项的定位算法,而不用进行表的顺序扫描(如二分查找法Q。这P可以快速定位到W一个匹配的|以节省大量搜索时间。数据库利用了各U各L快速定位烦引值的技术,q些技术是什么ƈ不重要,重要的是它们工作正常Q烦引技术是个好东西?/span>

    有h会问Qؓ什么不只对数据文gq行排序Q省掉烦引文Ӟq样不也在搜索时产生相同的效果吗Q问得好Q如果只有单个烦引时Q?/span>

是这L。不q有可能会用到第二个索引Q但同时以两U不同的Ҏ对同一个数据文件进行排序是不可能的。(如,惌一个顾客名的烦

引,同时又要一个顾?/span>ID h电话L的烦引。)烦引文件作Z个与数据文g独立的实体就解决了这个问题,而且允许创徏多个?/span>

引。此外,索引中的行一般要比数据文件中的行短。在插入或删除值时Qؓ保持排序序而移动较短的索引gUd较长的数据行相比?/span>

为容易?/span>

      

    q个例子?/span>MySQL索引表的Ҏ相符。表的数据行保存在数据文件中Q而烦引g存在索引文g中。一个表上可有不止一个烦引;如果实有不止一个烦引,它们都保存在同一个烦引文件中。烦引文件中的每个烦引由排过序的用来快速访问数据文件的键记录数l构成?/span>

前面的讨论描qC单表查询中烦引的好处Q其中用烦引消除了全表扫描Q极大地加快了搜索的速度。在执行涉及多个表的q接查询Ӟ索引甚至会更有h倹{在单个表的查询中,每列需要查看的值的数目是表中行的数目。而在多个表的查询中,可能的组合数目极大,因ؓq个数目为各表中行数之积?/span>

    假如有三个未索引的表t 1?/span>t 2?/span>t 3Q分别只包含?/span>c 1?/span>c 2?/span>c 3Q每个表分别由含有数?/span>1?/span>1000 ?/span>1000 行组成。查扑֯应值相{的表行l合的查询如下所C:

    SELECT c1,c2,c3

    FROM t1,t2,t3

    WHERE c1=c2 AND c1=c3

    此查询的l果应该?/span>1000 行,每个l合包含3 个相{的倹{如果我们在无烦引的情况下处理此查询Q则不可能知道哪些行包含那些倹{因此,必须L出所有组合以便得ZWHERE 子句盔R的那些组合。可能的l合数目?/span>10 0 0??0 0 0??0 0 0Q十亿)Q比匚w数目多一百万倍。很多工作都费了,q且q个查询会非常慢,即在如?/span>MySQLq样快的数据库中执行也会很慢。而这q是每个表中只有1000 行的情Ş。如果每个表中有一百万行时Q将会怎样Q很昄Q这样将会生性能极ؓ低下的结果。如果对每个表进行烦引,p极大地加速查询进E,因ؓ利用索引的查询处理如下:

    1) 如下从表t1中选择W一行,查看此行所包含的倹{?/span>

    2) 使用?/span>t2 上的索引Q直接蟩?/span>t2 中与来自t1的值匹配的行。类|利用?/span>t3 上的索引Q直接蟩?/span>t3 中与来自t1的值匹配的行?/span>

    3) q到?/span>t1的下一行ƈ重复前面的过E直?/span>t1中所有的行已l查q。在此情形下Q我们仍然对?/span>t1执行了一个完全扫描,但能够在?/span>t2 ?/span>t3 上进行烦引查扄接取些表中的行。从道理上说Q这时的查询比未用烦引时要快一百万倍。如上所qͼMySQL利用索引加速了WHERE 子句中与条g盔R的行的搜索,或者说在执行连接时加快了与其他表中的行匚w的行的搜索。它也利用烦引来改进其他操作的性能Q?/span>

    ?/span> 在?/span>MIN( ) ?/span>MAX( ) 函数Ӟ能够快速找到烦引列的最或最大倹{?/span>

    ?/span> MySQL常常能够利用索引来完?/span>ORDER BY 子句的排序操作?/span>

    ?/span> 有时Q?/span>MySQL可避免对整个数据文g的读取。假如从一个烦引数值列中选择|而且不选择表中其他列。这Ӟ通过对烦引值的dQ就已经得到了读取数据文件所要得到的倹{没有对相同的D行两ơ读取的必要Q因此,甚至无需涉及数据文g?/span>

    4.1.2 索引的弊?/span>

    一般情况下Q如?/span>MySQL能够知道怎样用烦引来更快地处理查询,它就会这样做。这表示Q在大多数情况下Q如果您不对表进行烦引,则损害的是您自己的利益。可以看出,作者描l了索引的诸多好处。但有不利之处吗Q是的,有。实际上Q这些缺点被优点所掩盖了,

但应该对它们有所了解?/span>

    首先Q烦引文件要占磁盘空间。如果有大量的烦引,索引文g可能会比数据文g更快地达到最大的文g寸。其ơ,索引文g加快了检索,但增加了插入和删除,以及更新索引列中的值的旉Q即Q降低了大多数涉及写入的操作的时_Q因为写操作不仅涉及数据行,而且q常常涉及烦引。一个表拥有的烦引越多,则写操作的^均性能下降p大。在4 . 4?#8220;有效地装载数?#8221;中,我们更l地介绍q些性能问题Qƈ讨论怎样解决?/span>

    4.1.3 选择索引

    创徏索引的语法已l在3 . 4 . 3?#8220;创徏和删除烦?#8221;中进行了介绍。这里,我们假定您已l阅读过该节。但是知道语法ƈ不能帮助定表怎样q行索引。要军_表怎样q行索引需要考虑表的使用方式。本节介l一些关于怎样定和挑选烦引列的准则:

    ?/span> 搜烦的烦引列Q不一定是所要选择的列。换句话_最适合索引的列是出现在WHERE 子句中的列,或连接子句中指定的列Q而不是出现在SELECT 关键字后的选择列表中的列:

 

 

    当然Q所选择的列和用?/span>WHERE 子句的列也可能是相同的。关键是Q列出现在选择列表中不是该列应该烦引的标志。出现在q接子句中的列或出现在Ş?/span>col1= col2 的表辑ּ中的列是很适合索引的列。查询中?/span>col_b ?/span>col_c 是q样的例子。如?/span>MySQL能利用连接列来优化一个查询,表示它通过消除全表扫描相当可观地减了表行的组合?/span>

    ?/span> 使用惟一索引。考虑某列中值的分布。对于惟一值的列,索引的效果最好,而具有多个重复值的列,其烦引效果最差。例如,存放q龄的列h不同|很容易区分各行。而用来记录性别的列Q只含有“ M”?#8220;F”Q则Ҏ列进行烦引没有多大用处(不管搜烦哪个|都会得出大约一半的行)?/span>

    ?/span> 使用短烦引。如果对串列q行索引Q应该指定一个前~长度Q只要有可能应该这样做。例如,如果有一?/span>CHAR(200) 列,如果在前10 个或20 个字W内Q多数值是惟一的,那么׃要对整个列进行烦引。对?/span>10 个或20 个字W进行烦引能够节省大量烦引空_也可能会使查询更快。较的索引涉及的磁?/span>I/O 较少Q较短的值比较v来更快。更为重要的是,对于较短的键|索引高速缓存中的块能容Ux多的键|因此Q?/span>MySQL也可以在内存中容Ux多的倹{这增加了找到行而不用读取烦引中较多块的可能性。(当然Q应该利用一些常识。如仅用列值的W一个字W进行烦引是不可能有多大好处的,因ؓq个索引中不会有许多不同的倹{)

    ?/span> 利用最左前~。在创徏一?/span>n 列的索引Ӟ实际是创ZMySQL可利用的n 个烦引。多列烦引可起几个烦引的作用Q因为可利用索引中最左边的列集来匚w行。这L列集UCؓ最左前~。(q与索引一个列的前~不同Q烦引一个列的前~是利用该的前n 个字W作为烦引倹{)

    假如一个表在分别名?/span>s t a t e?/span>city ?/span>zip 的三个列上有一个烦引。烦引中的行是按state/city/zip 的次序存攄Q因此,索引中的行也会自动按state/city 的顺序和state 的顺序存放。这表示Q即使在查询中只指定state 值或只指?/span>state ?/span>city 的|MySQL也可以利用烦引。因此,此烦引可用来搜烦下列的列l合Q?/span>

    state,city,zip

    state,city

    sate

    MySQL不能使用不涉及左前缀的搜索。例如,如果?/span>city ?/span>zip q行搜烦Q则不能使用该烦引。如果要搜烦某个州以及某?/span>zip 代码Q烦引中的列1和列3Q,则此索引不能用于相应值的l合。但是,可利用烦引来L与该州相W的行,以减搜索范围?/span>



persister 2009-08-20 11:37 发表评论
]]>
MySQL Got a packet bigger than 'max_allowed_packet' bytes错误http://www.tkk7.com/persister/archive/2009/07/30/289186.htmlpersisterpersisterThu, 30 Jul 2009 14:54:00 GMThttp://www.tkk7.com/persister/archive/2009/07/30/289186.htmlhttp://www.tkk7.com/persister/comments/289186.htmlhttp://www.tkk7.com/persister/archive/2009/07/30/289186.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/289186.htmlhttp://www.tkk7.com/persister/services/trackbacks/289186.html
Error Code:1153 Got a packet bigger than 'max_allowed_packet' bytes错误提示?br /> 开始没注意Q提CZ大堆Q后来才看见q句
使用SQLyog工具导出MySQL数据Ӟ当数据量大时Q导Z会错误,但导入时会出现错误。如果将SQL单独执行会发现是Error Code:1153 Got a packet bigger than 'max_allowed_packet' bytes错误?br /> 对于q个问题可以在my.ini中最后增加一行max_allowed_packet=16M卛_Q根据实际情况设|)?br />
注意Q在[client]和[mysql]部分增加无效Q那个是客户端读取的参数?

persister 2009-07-30 22:54 发表评论
]]>
mysql repair命ohttp://www.tkk7.com/persister/archive/2009/04/23/267192.htmlpersisterpersisterThu, 23 Apr 2009 09:30:00 GMThttp://www.tkk7.com/persister/archive/2009/04/23/267192.htmlhttp://www.tkk7.com/persister/comments/267192.htmlhttp://www.tkk7.com/persister/archive/2009/04/23/267192.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/267192.htmlhttp://www.tkk7.com/persister/services/trackbacks/267192.html
SequenceUtil.SequenceBank.fillBank] SQL Exception while executing the following:
UPDATE SEQUENCE_VALUE_ITEM SET SEQ_ID=SEQ_ID+100 WHERE SEQ_NAME='Visit'
Error was:Incorrect key file for table './ccbofbiz/sequence_value_item.MYI'; try to repair it
Exception: java.sql.SQLException
Message: Incorrect key file for table './ccbofbiz/sequence_value_item.MYI'; try to repair it

很少看到q样的错误,今天被我到了,哈哈
q行如下命oQ?br /> repair table SEQUENCE_VALUE_ITEM

成功了,非常行不错?

persister 2009-04-23 17:30 发表评论
]]>
从LiveJournal后台发展看大规模|站性能优化Ҏ(无图片版)http://www.tkk7.com/persister/archive/2008/12/05/244515.htmlpersisterpersisterFri, 05 Dec 2008 02:52:00 GMThttp://www.tkk7.com/persister/archive/2008/12/05/244515.htmlhttp://www.tkk7.com/persister/comments/244515.htmlhttp://www.tkk7.com/persister/archive/2008/12/05/244515.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/244515.htmlhttp://www.tkk7.com/persister/services/trackbacks/244515.html此ؓ转蝲Q原文请自行搜烦?/h3>

一、LiveJournal发展历程

LiveJournal?9q始于校园中的项目,几个人出于爱好做了这样一个应用,以实C下功能:
  • 博客Q论?
  • C会性网l,扑ֈ朋友
  • 聚合Q把朋友的文章聚合在一?/li>
LiveJournal采用了大量的开源YӞ甚至它本w也是一个开源Y件?

在上U后QLiveJournal实现了非常快速的增长Q?/p>

  • 2004q?月䆾Q?80万注册用戗?
  • 2005q?月䆾Q?80万注册用戗?
  • 2005q?月䆾Q?90万注册用戗?
  • 辑ֈ了每U钟上千ơ的面h及处理?
  • 使用了大量MySQL服务器?
  • 使用了大量通用lg?/li>

二、LiveJournal架构现状概况



三、从LiveJournal发展中学?/h2>

 

LiveJournal?台服务器发展?00台服务器Q这其中l历了无数的伤痛Q但同时也摸索出了解册些问题的ҎQ通过对LiveJournal的学习,可以让我们避免LJ曄犯过的错误,q且从一开始就对系l进行良好的设计Q以避免后期的痛苦?/p>

下面我们一步一步看LJ发展的脚步?/p>

1、一台服务器

一台别人捐助的服务器,LJ最初就跑在上面Q就像Google开始时候用的破服务器一P值得我们敬。这个阶D,LJ的h以惊人的速度熟悉的Unix的操作管理,服务器性能出现q问题,不过q好Q可以通过一些小修小改应付过厅R在q个阶段里LJ把CGI升CFastCGI?/p>

最l问题出CQ网站越来越慢,已经无法通过优过化来解决的地步,需要更多的服务器,q时LJ开始提供付Ҏ务,可能是想通过q些钱来购买新的服务器,以解军_时的困境?br /> 毫无疑问Q当时LJ存在巨大的单炚w题,所有的东西都在那台服务器的铁皮盒子里装着?/p>


2、两台服务器

用付Ҏ务赚来的钱LJC两台服务器:一台叫做Kenny的Dell 6U机器用于提供Web服务Q一台叫做Cartman的Dell 6U服务器用于提供数据库服务?/p>


LJ有了更大的磁盘,更多的计资源。但同时|络l构q是非常单,每台机器两块|卡QCartman通过内网为Kenny提供MySQL数据库服务?br />
暂时解决了负载的问题Q新的问题又出现了:

  • 原来的一个单点变成了两个单点?
  • 没有冷备份或热备份?
  • |站速度慢的问题又开始出CQ没办法Q增长太快了?
  • Web服务器上CPU辑ֈ上限Q需要更多的Web服务器?/li>

3、四台服务器

又买了两収ͼKyle和StanQ这ơ都?U的,都用于提供Web服务。目前LJ一共有3台Web服务器和一台数据库服务器。这旉要在3台Web服务器上q行负蝲均横?/p>


LJ把Kenny用于外部的网养I使用mod_backhandq行负蝲均横?/p>

然后问题又出CQ?/p>

  • 单点故障。数据库和用于做|关的Web服务器都是单点,一旦Q何一台机器出现问题将D所有服务不可用。虽然用于做|关的Web服务器可以通过保持心蟩同步q速切换,但还是无法解x据库的单点,LJ当时也没做这个?
  • |站又变慢了Q这ơ是因ؓIO和数据库的问题,问题是怎么往应用里面d数据库呢Q?/li>

4、五台服务器

又买了一台数据库服务器。在两台数据库服务器上用了数据库同?Mysql支持的Master-Slave模式)Q写操作全部针对L据库Q通过BinlogQ主服务器上的写操作可以q速同步到从服务器上)Q读操作在两个数据库上同时进?也算是负载均横的一U吧)?/p>


实现同步时要注意几个事项Q?/p>

  • L作数据库选择法处理Q要选一个当前负载轻一点的数据库?
  • 在从数据库服务器上只能进行读操作
  • 准备好应对同步过E中的gq,处理不好可能会导致数据库同步的中断。只需要对写操作进行判断即可,L作不存在同步问题?/li>

5、更多服务器

有钱了,当然要多C服务器。部|后快了没多久,又开始慢了。这ơ有更多的Web服务器,更多的数据库服务器,存在 IO与CPU争用。于是采用了BIG-IP作ؓ负蝲均衡解决Ҏ?/p>


6、现在我们在哪里Q?/h2>


现在服务器基本上够了Q但性能q是有问题,原因出在架构上?/p>

数据库的架构是最大的问题。由于增加的数据库都是以Slave模式d到应用内Q这样唯一的好处就是将L作分布到了多台机器,但这样带来的后果是写操作被大量分发Q每台机器都要执行,服务器越多,费p大,随着写操作的增加Q用于服务读操作的资源越来越?/p>


׃台分布到两台


最l效?/p>

现在我们发现Q我们ƈ不需要把q些数据在如此多的服务器上都保留一份。服务器上已l做了RAIDQ数据库也进行了备䆾Q这么多的备份完全是对资源的费Q属于冗余极端过度。那Z么不把数据分布存储呢Q?/p>

问题发现了,开始考虑如何解决。现在要做的是把不同用L数据分布C同的服务器上q行存储Q以实现数据的分布式存储Q让每台机器只ؓ相对固定的用h务,以实现^行的架构和良好的可扩展性?/p>

Z实现用户分组Q我们需要ؓ每一个用户分配一个组标记Q用于标记此用户的数据存攑֜哪一l数据库服务器中。每l数据库׃个master及几个slavel成Qƈ且slave的数量在2-3収ͼ以实现系l资源的最合理分配Q既保证数据L作分布,又避免数据过度冗余以及同步操作对pȝ资源的过度消耗?/p>


׃収ͼ一l)中心服务器提供用户分l控制。所有用L分组信息都存储在q台机器上,所有针对用L操作需要先查询q台机器得到用户的组P然后再到相应的数据库l中获取数据?/p>

q样的用h构与目前LJ的架构已l很相像了?/p>

在具体的实现旉要注意几个问题:

  • 在数据库l内不要使用自增IDQ以便于以后在数据库l之间迁UȝP以实现更合理的I/OQ磁盘空间及负蝲分布?
  • useridQpostid存储在全局服务器上Q可以用自增,数据库组中的相应值必M全局服务器上的gؓ准。全局服务器上使用事务型数据库InnoDB?
  • 在数据库l之间迁Uȝh要万分小心,当迁UL用户不能有写操作?/li>

7、现在我们在哪里


问题Q?/p>

  • 一个全局L务器Q挂掉的话所有用h册及写操作就挂掉?
  • 每个数据库组一个主服务器,挂掉的话q组用户的写操作挂掉?
  • 数据库组从服务器挂掉的话会导致其它服务器负蝲q大?/li>

对于Master-Slave模式的单炚w题,LJ采取了Master-Master模式来解冟뀂所谓Master-Master实际上是人工实现的,q不是由MySQL直接提供的,实际上也是两台机器同时是MasterQ也同时是SlaveQ互相同步?/p>

Master-Master实现旉要注意:

  • 一个Master出错后恢复同步,最好由服务器自动完成?
  • 数字分配Q由于同时在两台机器上写Q有些ID可能会冲H?/li>

解决ҎQ?br />

  • 奇偶数分配IDQ一台机器上写奇敎ͼ一台机器上写偶?
  • 通过全局服务器进行分?LJ采用的做??/li>

 

Master-Master模式q有一U用法,q种Ҏ与前一U相比,仍然保持两台机器的同步,但只有一台机器提供服务(d写)Q在每天晚上的时候进行轮换,或者出现问题的时候进行切换?/p>

8、现在我们在哪里


现在插播一条广告,MyISAM VS InnoDB?/p>

使用InnoDBQ?/p>

  • 支持事务
  • 需要做更多的配|,不过值得Q可以更安全的存储数据,以及得到更快的速度?/li>

使用MyISAMQ?/p>

  • 记录日志QLJ用它来记|络讉K日志Q?
  • 存储只读静态数据,_快?
  • q发性很差,无法同时d数据Q添加数据可以)
  • MySQL非正常关闭或L时会D索引错误Q需要用myisamchk修复Q而且当访问量大时出现非常频繁?/li>

9、缓?/h2>

d我写q?a >一文章介lmemcachedQ它是由LJ的团队开发的一Ƅ存工P以key-value的方式将数据存储到分布的内存中。LJ~存的数据:

  • 12台独立服务器Q不是捐赠的Q?
  • 28个实?
  • 30GBd?
  • 90-93%的命中率Q用qsquid的h可能知道Qsquid内存加磁盘的命中率大概在70-80%Q?/li>

如何建立~存{略Q?/p>

想缓存所有的东西Q那是不可能的,我们只需要缓存已l或者可能导致系l瓶颈的地方Q最大程度的提交pȝq行效率。通过对MySQL的日志的分析我们可以扑ֈ~存的对象?/p>

~存的缺点?

  • 没有完美的事物,~存也有~点Q?
  • 增大开发量Q需要针对缓存处理编写特D的代码?
  • 理隑ֺ增加Q需要更多h参与pȝl护?
  • 当然大内存也需要钱?/li>

10、Web讉K负蝲均衡

在数据包U别使用BIG-IPQ但BIG-IPq不知道我们内部的处理机Ӟ无法判断由哪台服务器对这些请求进行处理。反向代理ƈ不能很好的vC用,不是已经够快了,是达不到我们想要的效果?/p>

所以,LJ又开发了Perlbal。特点:

  • 快,,可管理的http web 服务?代理
  • 可以在内部进行{?
  • 使用Perl开?
  • 单线E,异步Q基于事Ӟ使用epoll , kqueue
  • 支持Console理与httpq程理Q支持动态配|加?
  • 多种模式Qweb服务器,反向代理Q插?
  • 支持插gQGIF/PNG互换Q?/li>

11、MogileFS

LJ使用开源的MogileFS作ؓ分布式文件存储系l。MogileFS使用非常单,它的主要设计思想是:

  • 文g属于c(cL最的复制单位Q?
  • 跟踪文g存储位置
  • 在不同主Z存储
  • 使用MySQL集群l一存储分布信息
  • 大容易廉L?/li>

到目前ؓ止就q么多了Q更多文档可以在http://www.danga.com/words/扑ֈ?a >Danga.com?a >LiveJournal.com的同学们拿这个文档参加了两次MySQL ConQ两ơOS ConQ以及众多的其它会议Q无U的把他们的l验分n出来Q值得我们学习。在web2.0时代快速开发得到大家越来越多的重视Q但良好的设计仍是每一个应用的基础Q希望web2.0们在成长为Top500|站的\上,不要因ؓ架构ȝ了网站的发展?/p>

参考资料:http://www.danga.com/words/2005_oscon/oscon-2005.pdf



persister 2008-12-05 10:52 发表评论
]]>对mysql explain讲的比较清楚?/title><link>http://www.tkk7.com/persister/archive/2008/10/27/236813.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 27 Oct 2008 02:40:00 GMT</pubDate><guid>http://www.tkk7.com/persister/archive/2008/10/27/236813.html</guid><wfw:comment>http://www.tkk7.com/persister/comments/236813.html</wfw:comment><comments>http://www.tkk7.com/persister/archive/2008/10/27/236813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/persister/comments/commentRss/236813.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/persister/services/trackbacks/236813.html</trackback:ping><description><![CDATA[?explain的帮助下Q您q道什么时候该l表d索引Q以使用索引来查找记录从而让select q行更快?br /> 如果׃不恰当用烦引而引起一些问题的话,可以q行 analyze table来更新该表的l计信息Q例如键的基敎ͼ它能帮您在优化方面做出更好的选择?br /> <br /> explain q回了一行记录,它包括了 select语句中用到的各个表的信息。这些表在结果中按照mysql卛_执行的查询中d的顺序列出来。mysql用一ơ扫描多ơ连接(single- sweep,multi-joinQ的Ҏ来解册接。这意味着mysql从第一个表中读取一条记录,然后在第二个表中查找到对应的记录Q然后在W三个表 中查找,依次cL。当所有的表都扫描完了Q它输出选择的字Dƈ且回溯所有的表,直到找不Cؓ止,因ؓ有的表中可能有多条匹配的记录下一条记录将从该表读 取,再从下一个表开始l处理?br /> 在mysql version 4.1中,explain输出的结果格式改变了Q得它更适合例如 union语句、子查询以及z表的l构。更令h注意的是Q它新增?个字D: id?select_type。当你用早于mysql4.1的版本就看不到这些字D了?br /> explainl果的每行记录显CZ每个表的相关信息Q每行记录都包含以下几个字段Q?br /> <br /> id <br /> 本次 select 的标识符。在查询中每?select都有一个顺序的数倹{?br /> select_type <br /> select 的类型,可能会有以下几种Q?br /> simple: 单的 select Q没有?union或子查询Q?br /> <br /> primary: 最外层?select?br /> <br /> union: W二层,在select 之后使用?union?br /> <br /> dependent union: union 语句中的W二个selectQ依赖于外部子查?br /> <br /> subquery: 子查询中的第一?select<br /> <br /> dependent subquery: 子查询中的第一?subquery依赖于外部的子查?br /> <br /> derived: z?selectQfrom子句中的子查询)<br /> <br /> table<br /> 记录查询引用的表?br /> <br /> type<br /> 表连接类型。以下列Z各种不同cd的表q接Q依ơ是从最好的到最差的Q?br /> <br /> system:表只有一行记录({于pȝ表)。这?const表连接类型的一个特例?br /> <br /> const:表中最多只有一行匹配的记录Q它在查询一开始的时候就会被d出来。由于只有一行记录,在余下的优化E序里该行记录的字段值可以被当作是一? 恒定倹{const表查询v来非常快Q因为只要读取一ơ!const 用于在和 primary key 或unique 索引中有固定值比较的情Ş。下面的几个查询中,tbl_name 是 c表了Q?br /> select * from tbl_name where primary_key=1; select * from tbl_namewhere primary_key_part1=1 and primary_key_part2=2;<br /> <br /> eq_ref:从该表中会有一行记录被d出来以和从前一个表中读取出来的记录做联合。与constcd不同的是Q这是最好的q接cd。它用在索引所有部 分都用于做连接ƈ且这个烦引是一个primary key ?unique cd。eq_ref可以用于在进?="做比较时索字Dc比较的值可以是固定值或者是表达式,表达CZ可以使用表里的字D,它们在读表之前已l准备好 了。以下的几个例子中,mysql使用了eq_ref q接来处?ref_tableQ?br /> <br /> <br /> select * from ref_table,other_table whereref_table.key_column=other_table.column; select * fromref_table,other_table whereref_table.key_column_part1=other_table.column andref_table.key_column_part2=1;<br /> <br /> ref: 该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref用于q接E序使用键的最左前~或者是该键不是 primary key ? unique索引Q换句话_是q接E序无法Ҏ键值只取得一条记录)的情c当Ҏ键值只查询到少数几条匹配的记录Ӟq就是一个不错的q接cd? refq可以用于检索字D?=操作W来比较的时候。以下的几个例子中,mysql?ref 来处理ref_tableQ?br /> select * from ref_table where key_column=expr; select * fromref_table,other_table whereref_table.key_column=other_table.column; select * fromref_table,other_table whereref_table.key_column_part1=other_table.column andref_table.key_column_part2=1;<br /> <br /> ref_or_null: q种q接cdcM refQ不同的是mysql会在索的时候额外的搜烦包含null 值的记录。这U连接类型的优化是从mysql4.1.1开始的Q它l常用于子查询。在以下的例子中Qmysql使用ref_or_null cd来处? ref_tableQ?br /> select * from ref_table where key_column=expr or key_column is null;<br /> <br /> <br /> unique_subquery: q种cd用例如一下Ş式的 in 子查询来替换 refQ?br /> value in (select primary_key from single_table where some_expr)<br /> <br /> unique_subquery: 只是用来完全替换子查询的索引查找函数效率更高了?br /> <br /> index_subquery: q种q接cdcM unique_subquery。它用子查询来代替inQ不q它用于在子查询中没有唯一索引的情况下Q例如以下Ş式:<br /> value in (select key_column from single_table where some_expr)<br /> <br /> range: 只有在给定范围的记录才会被取出来Q利用烦引来取得一条记录。key字段表示使用了哪个烦引。key_len字段包括了用的键的最镉K分。这U类型时 ref 字段值是 null。range用于某个字D和一个定植用以下M操作W比较时 =, <>, >,>=, <, <=, is null, <=>, between, ?inQ?br /> select * from tbl_name where key_column = 10; select * fromtbl_name where key_column between 10 and 20; select * from tbl_namewhere key_column in (10,20,30); select * from tbl_name wherekey_part1= 10 and key_part2 in (10,20,30);<br /> <br /> index: q接cd?all 一P不同的是它只扫描索引树。它通常会比 all快点Q因为烦引文仉常比数据文件小。mysql在查询的字段知识单独的烦引的一部分的情况下使用q种q接cd?br /> <br /> all: 对该表做全部扫描以和从前一个表中取得的记录作联合。这时候如果第一个表没有被标识ؓconst的话׃大好了,在其他情况下通常是非常糟p的。正常地Q可以通过增加索引使得能从表中更快的取得记录以避免all?br /> <br /> <br /> possible_keys<br /> possible_keys字段是指 mysql在搜索表记录时可能用哪个烦引。注意,q个字段完全独立于explain 昄的表序。这意味着 possible_keys里面所包含的烦引可能在实际的用中没用到。如果这个字D늚值是nullQ就表示没有索引被用到。这U情况下Q就可以? where子句中哪些字D那些字D适合增加索引以提高查询的性能。就q样Q创Z下烦引,然后再用explain 查一下。详l的查看章节"14.2.2 alter tablesyntax"。想看表都有什么烦引,可以通过 show index from tbl_name来看?br /> <br />  <br /> key<br /> key字段昄了mysql实际上要用的索引。当没有M索引被用到的时候,q个字段的值就是null。想要让mysql使用或者忽略在 possible_keys字段中的索引列表Q可以在查询语句中用关键字force index, use index,?ignore index。如果是 myisam ?bdb cd表,可以使用 analyzetable 来帮助分析用用哪个烦引更好。如果是 myisamcd表,q行命o myisamchk --analyze也是一L效果。详l的可以查看章节"14.5.2.1 analyze tablesyntax"?5.7.2 table maintenance and crash recovery"?br /> <br /> key_len<br /> key_len 字段昄了mysql使用索引的长度。当 key 字段的gؓ nullӞ索引的长度就?null。注意,key_len的值可以告诉你在联合烦引中mysql会真正用了哪些索引?br /> <br /> ref<br /> ref 字段昄了哪些字D|者常量被用来?key配合从表中查询记录出来?br /> <br /> rows<br /> rows 字段昄了mysql认ؓ在查询中应该索的记录数?br /> <br /> extra<br /> <br /> 本字D|CZ查询中mysql的附加信息。以下是q个字段的几个不同值的解释Q?br /> <br /> distinct:mysql当找到当前记录的匚w联合l果的第一条记录之后,׃再搜索其他记录了?br /> <br /> not exists:mysql在查询时做一?left join优化Ӟ当它在当前表中找C和前一条记录符?left join条g后,׃再搜索更多的记录了。下面是一个这U类型的查询例子Q?br /> select * from t1 left join t2 on t1.id=t2.id where t2.id isnull;<br /> <br /> 假 t2.id 定义?not null。这U情况下Qmysql会扫描?t1q且?t1.id 的值在 t2 中查找记录。当? t2中找C条匹配的记录Ӟq就意味着 t2.id 肯定不会都是nullQ就不会再在 t2 中查扄?id值的其他记录了。也可以q么_对于 t1 中的每个记录Qmysql只需要在t2 中做一ơ查找,而不在 t2 中实际有多少匚w的记录?br /> <br /> range checked for each record (index map: #)<br /> <br /> mysql没找到合适的可用的烦引。取代的办法是,对于前一个表的每一个行q接Q它会做一个检验以军_该用哪个烦引(如果有的话)Qƈ且用这个烦引来从表里取得记录。这个过E不会很快,但L没有M索引时做表连接来得快?br /> <br /> using filesort: mysql需要额外的做一遍从而以排好的顺序取得记录。排序程序根据连接的cd遍历所有的记录Qƈ且将所有符? where条g的记录的要排序的键和指向记录的指针存储v来。这些键已经排完序了Q对应的记录也会按照排好的顺序取出来。详情请?7.2.9how mysql optimizes order by"?br /> using index<br /> <br /> 字段的信息直接从索引树中的信息取得,而不再去扫描实际的记录。这U策略用于查询时的字D|一个独立烦引的一部分?br /> <br /> using temporary: mysql需要创Z时表存储l果以完成查询。这U情况通常发生在查询时包含了groupby ?order by 子句Q它以不同的方式列出了各个字Dc?br /> using where<br /> <br /> where子句用来限制哪些记录匹配了下一个表或者发送给客户端。除非你特别地想要取得或者检查表U的所有记录,否则的话当查询的extra 字段g?using where q且表连接类型是 all ?index时可能表C有问题?br /> <br /> <br /> 如果你想要让查询可能的快,那么应该注?extra 字段的gؓusingfilesort ?using temporary 的情c?br /> <br /> 你可以通过 explain 的结果中 rows字段的值的乘积大概地知道本ơ连接表现如何。它可以_略地告诉我们mysql在查询过E中会查询多条记录。如果是使用pȝ变量 max_join_size 来取得查询结果,q个乘积q可以用来确定会执行哪些多表select 语句?br /> 下面的例子展CZ如何通过 explain提供的信息来较大E度C化多表联合查询的性能?br /> 假设有下面的 select 语句Q正打算?explain 来检:<br /> explain select tt.ticketnumber, tt.timein, tt.projectreference,tt.estimatedshipdate, tt.actualshipdate, tt.clientid,tt.servicecodes, tt.repetitiveid, tt.currentprocess,tt.currentdppers tt.recordvolume, tt.dpprinted, et.country,et_1.country, do.custname from tt, et, et as et_1, do wherett.submittime is null and tt.actualpc = et.employid andtt.assignedpc = et_1.employid and tt.clientid = do.custnmbr;<br /> <br /> 在这个例子中Q先做以下假设:<br /> <br />  <br /> <br /> 要比较的字段定义如下Q?br /> table  column  columntype <br /> tt  actualpc char(10) <br /> tt  assignedpc char(10) <br /> tt  clientid char(10) <br /> et  employid char(15) <br /> do  custnmbr char(15) <br /> <br /> <br /> 数据表的索引如下Q?br /> table  index <br /> tt  actualpc <br /> tt  assignedpc <br /> tt  clientid <br /> et  employid (primary key) <br /> do  custnmbr (primary key) <br /> <br /> <br /> tt.actualpc 的值是不均匀分布的?br /> <br /> 在Q何优化措施未采取之前Q经q?explain分析的结果显C如下:<br /> table type possible_keys key key_len ref rows extra <br /> et all primarynull null null 74 <br /> do all primary null null null 2135 <br /> et_1 allprimary null null null 74 <br /> tt all assignedpc, null null null 3872 clientid, actualpc range checked for each record (key map: 35)<br /> <br /> ׃字段 type 的对于每个表值都是allQ这个结果意味着mysqlҎ有的表做一个_卡尔U;q就是说Q每条记录的l合。这需要花很长的时_因ؓ需要扫描每个表? 记录CU的d。在q情况下Q它的积?4 * 2135 * 74 * 3872 = 45,268,558,720条记录。如果数据表更大的话Q你可以惌一下需要多长的旉?br /> 在这里有个问题是当字D定义一L时候,mysql可以在q些字段上更快的是用索引Q对isamcd的表来说Q除非字D定义完全一P否则不会使用? 引)。在q个前提下,varchar?char是一L除非它们定义的长度不一致。由?tt.actualpc 定义为char(10)Qet.employid 定义?char(15)Q二者长度不一致?br /> Z解决q个问题Q需要用 alter table 来加?actualpc的长度从10?5个字W:<br /> mysql> alter table tt modify actualpc varchar(15);<br /> <br /> 现在 tt.actualpc ?et.employid 都是 varchar(15)<br /> 了。再来执行一?explain 语句看看l果Q?br /> table type possible_keys key key_len ref rows extra <br /> tt allassignedpc, null null null 3872 using clientid, where actualpc <br /> do all primary null null null 2135 range checked for each record (keymap: 1) <br /> et_1 all primary null null null 74 range checked for eachrecord (key map: 1) et eq_ref primary primary 15 tt.actualpc 1<br /> <br /> q还不够Q它q可以做的更好:现在 rowsgU已l少?4倍。这ơ查询需要用2U钟?br /> W二个改变是消除在比?tt.assignedpc = et_1.employid ?tt.clientid= do.custnmbr 中字D늚长度不一致问题:<br /> mysql> alter table tt modify assignedpc varchar(15), ->modify clientid varchar(15);<br /> <br /> 现在 explain 的结果如下:<br /> table type possible_keys key key_len ref rows extra <br /> et all primary null null null 74 <br /> tt ref assignedpc, actualpc 15 et.employid 52 using clientid, where actualpc <br /> et_1 eq_ref primary primary 15 tt.assignedpc 1 <br /> do eq_ref primary primary 15 tt.clientid 1<br /> <br /> q看h已经是能做的最好的l果了?br /> 遗留下来的问题是Qmysql默认地认为字D?tt.actualpc的值是均匀分布的,然而表 ttq如此。幸好,我们可以很方便的让mysql分析索引的分布:<br /> mysql> analyze table tt;<br /> <br /> 到此为止Q表q接已经优化的很完美了,explain 的结果如下:<br /> table type possible_keys key key_len ref rows extra <br /> tt all assignedpc null null null 3872 using clientid, where actualpc <br /> et eq_ref primary primary 15 tt.actualpc 1 <br /> et_1 eq_ref primary primary 15 tt.assignedpc 1 <br /> do eq_ref primary primary 15 tt.clientid 1<br /> <br /> h意,explain l果中的 rows字段的g是mysql的连接优化程序大致猜的Q请查这个D真实值是否基本一致。如果不是,可以通过在select 语句中? straight_join 来取得更好的性能Q同时可以试着在from分句中用不同的次序列出各个表? <img src ="http://www.tkk7.com/persister/aggbug/236813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/persister/" target="_blank">persister</a> 2008-10-27 10:40 <a href="http://www.tkk7.com/persister/archive/2008/10/27/236813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://maopiandao163.com" target="_blank">޵av</a>| <a href="http://www003924.com" target="_blank">þù޵Ӱ</a>| <a href="http://468862.com" target="_blank">ҹ˾Ʒɫ</a>| <a href="http://boyonet.com" target="_blank">鶹Ƶѹۿ</a>| <a href="http://z88d.com" target="_blank">ӰԺ߲</a>| <a href="http://yy12345.com" target="_blank">þùƷר</a>| <a href="http://22youjizz.com" target="_blank">ۺ</a>| <a href="http://4922000.com" target="_blank">һƵ</a>| <a href="http://6006284.com" target="_blank">˾޾ƷӰԺ</a>| <a href="http://tlyyt.com" target="_blank">ӰҹƵ</a>| <a href="http://qixiresort.com" target="_blank">޹Ʒר</a>| <a href="http://bdgxhome.com" target="_blank">ŮػҹƵѿ</a>| <a href="http://www2019rz.com" target="_blank">պһ</a>| <a href="http://chaikexin.com" target="_blank">պһƵ</a>| <a href="http://kypbuy.com" target="_blank">ݺݺݰƵ</a>| <a href="http://xx16xx.com" target="_blank">޾Ʒ߹ۿ̬ͼ</a>| <a href="http://kypbuy.com" target="_blank">۲ӰԺ߲wwwѹۿ </a>| <a href="http://doctor5470.com" target="_blank">޾Ʒѿ</a>| <a href="http://haigoumama.com" target="_blank">a˵</a>| <a href="http://kutuwo.com" target="_blank">ôӲˬƵ</a>| <a href="http://ganbadei.com" target="_blank">ɫAëƬѿ</a>| <a href="http://www026qqcom.com" target="_blank">Ļߵ</a>| <a href="http://fkg675.com" target="_blank">91ƷѾþù鶹</a>| <a href="http://zhongxueping888.com" target="_blank">޳վ</a>| <a href="http://helloyp.com" target="_blank">Ļó</a>| <a href="http://xzgfbxg.com" target="_blank">һƵۿwww</a>| <a href="http://lidajc.com" target="_blank">þþþ޾Ʒվ</a>| <a href="http://tuopumao.com" target="_blank">þþƷһ</a>| <a href="http://cdlsy.com" target="_blank">Ƶ</a>| <a href="http://xa69.com" target="_blank">޾Ʒ</a>| <a href="http://dfcnpc.com" target="_blank">һëƬ߹ۿ</a>| <a href="http://6878vip.com" target="_blank">Ʒ޶</a>| <a href="http://aabbcc567.com" target="_blank">þù޵Ӱ</a>| <a href="http://www-188588.com" target="_blank">ҹ˽ӰԺ</a>| <a href="http://gg596gg.com" target="_blank">GOGOGOѹۿ</a>| <a href="http://sx97zc.com" target="_blank">޽Сxxxx</a>| <a href="http://czdlglass.com" target="_blank">˾þۺ</a>| <a href="http://tmg-beelen.com" target="_blank">Ƶ߹ۿַ</a>| <a href="http://zzanfang.com" target="_blank">ҹƬ߹ۿ</a>| <a href="http://eddiekidd.com" target="_blank">ͼƬӰ</a>| <a href="http://zjpcyh.com" target="_blank">Ʒ޳ɦɦ߹ۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>