2009年4月28日星期二

QT4.4.3+windows vs2005编译安装详解

一. 安装准备:

1. 准备安装文件:

(1):Qt 4.4.3 OpenSource for Windows

下载地址: ftp://ftp.trolltech.no/qt/source/qt-win-opensource-src-4.4.3.zip

(2)Qt Visual Studio Integration v1.2.2 for.VS.2003.2005 英文版

下载地址:http://www.fixdown.com/china/Programming/2525.htm

(3)Visual Assist (代码提示功能,选装)

2. 已安装VS2005,安装其中C++即可.

3. 将下载的Qt 4.4.3文件解压. 如解压至目录D:\QT\4.4.3

4. 设置环境变量

右击我的电脑->属性->高级->环境变量;

在系统变量中新建QTDIR变量,变量值D:\QT\4.4.3

新建QMAKESPEC变量,变量值win32-msvc2005

在PATH变量中填加:D:\QT\4.4.3\bin;

PS:

==============================

value platform

win32-msvc VC6
win32-msvc2003 VS2003
win32-msvc2005 VS2005
win32-msvc2008 VS2008

==============================

至此准备工作结束.



二. 编译QT

1. 配置

在命令行提示符下进入QTDIR目录,如cd D:\QT\4.4.3

在命令行中输入configure -no-dsp -vcproj

(具体参数设置可输入configure /?查看)

configure 大约需几分钟时间.

2. 编译

configure完成后,会有提示.此时只需输入nmake进行编译.编译所花时间较长,两三个小时(视机器性能而定).



三. 安装Qt Visual Studio Integration v1.2.2

直接安装即可,用户名任意,注册码可取下列值之一:

FG6ALD-Y2PYGSX-F4M-LQAHD59-JZ6QKN-FJ7PXV-049B

FGEZDGX-AZPBJ8X-F4M-K44SA7M-UEG7TH-UYAML8M-05D7

FGPDXA9-MXKFJYM-F4M-BHEDKZX-8XCETXX-92WFVWX-A05E

FGWNPUX-Y6X26L9-F4M-GLZMY99-97RXPJX-BP256DX-737C



四. 配置VS2005

"工具"->"选项"->"QT"->"Builds"添加version name: 4.4.3 PATH: D:\QT\4.4.3

若安装了Visual Assist,则需选择"VAssistX" -> "Visual Assist X Options ..." -> "Projects", 在"Platform"里面把"Win32"改为"Custom",
在"Stable include files"中添加D:\Qt\4.3.3\include目录下的子文件夹.



将D:\QT\4.4.3\bin目录下的DLL文件拷到C:\windows目录下(注意,重装QT时记得删除或替换.否则可能会出现找不到链接入口的错误.)

至此安装结束.



五. 测试

VS2005中:"文件"->"新建"->"项目",选择"Qt Projects"->"Qt Application".输入名称.确定,FINISH,OK

双击解决方案中"hello.ui",即可弹出窗体编辑器.在窗体上加入一个WIDGET,如BUTTON.



编译运行即可.

2009年4月26日星期日

Qt 4.5 with Visual Studio 2008 (VC++ Express)

Qt is a cross platform GUI toolkit from Nokia. Its SDK is available under an LPGL license, it means we can use it free of charge to develop proprietary, commercial, closed-source software (thanks to Nokia). However, the current LPGL release leaves some gaps in using Qt from within Visual Studio 2008. This is somewhat understandable given that Visual Studio integration was a commercial-only offering and Nokia has Qt Creator (and not Visual Studio). My problem with Qt Creator is it uses MingGW (gcc) compiler which is nowhere near as good as VC++ 2008. Also for Visual Studio background like me, who is not familiar with Qt creator, learning Qt Creator will take time. Thanks to Wiria and AK who brought Qt to my table for a review.


Qt GUI Toolkit is very useful to develop portable application (single source codes) for *NIX, MAC and Windows (including Windows 98 but not being tested for Windows 7). In this post, I will show you how to start using Qt SDK only with Visual C++ 2008, you can use FREE Visual C++ 2008 express too.


Build VC++ Version of Qt


- Download and install qt-sdk-win-opensource-2009.01.1.
- Install the SDK to default directory, in my case C:\qt\2009.01. I didn;t install MingGW and Qt Creator as I don’t need.


- Once QT and VisualStudio 2008 both are installed and ready, open the VisualStudio 2008 Command Prompt.
- Change directory to the Qt SDK installation folder in the Command Prompt. Usually it would be of the form "C:\Qt\2009.01\qt"
- Run Configure.exe to target platform win32-msvc2008. You can simply run by typing configure or using other options. For example:

C:\Qt\2009.01\configure -no-sql-sqlite -no-qt3support -no-opengl -platform win32-msvc2008
-no-libtiff -no-dbus -no-phonon -no-phonon-backend -no-webkit

- Build Qt for use with Visual Studio 2008 by typing nmake
- Configure and nmake will take time, be patient enough. In my case, I started to build 19.17 PM and completed on 23.47 (4:30 hours)!
- Once completed, Qt SDK is ready for Visual Studio 2008.



Build and Run the Qt SDK Samples

Once your Qt SDK is ready to be used you can see samples directory in your Qt SDK installation (usually, C:\Qt\2009.01\qt\examples) and then open the examples.sln file from your Visual Studio 2008. If double-clicking .sln file does not work, open it manually from your Visual Studio. There are a lot of samples from Qt SDK.



If you build and debug – calculator project of instance – you will notification that the application because QtGuid4.dll was not found.



To let Visual Studio knows the include and library files of Qt, add their paths to the:

Visual Studio Tools|Options|Projects and Solutions|VC++ Directories

section. Typically you would want to add C:\Qt\2009.01\qt\include to the Include, C:\Qt\2009.01\qt\lib to the libraries and C:\Qt\2009.01\qt\bin to the Executables sections. Also you can add C:\Qt\2009.01\qt\bin to the Path System variable so that the Qt dlls get probed correctly when loaded from your application.



A lot of Qt samples inside the SDK. Try to build and run those sample applications to see how powerful Qt as GUI Toolkit.




Using Qt’s Visual Studio 2008 Plug-in

You can try Visual Studio add-in RC version (this will be a commercial product) to get integrated Qt templates and visual IDE features in Visual Studio 2008. I will not cover in this post, but this tools is promising. I will show you in my other Qt-VC++ post.



Hope this helps!

2009年4月15日星期三

www.sokmil.com/

无法查看这则摘要。请 点击此处查看博文。

multiple types in one declaration

multiple types in one declaration是什么意思?
悬赏分:5 - 解决时间:2008-6-17 14:44
在编译c++时出现这个问题,请大家帮助!
提问者: hexik - 秀才 三级
最佳答案
类型定义的时候忘了加分号了吧?
回答者: tanarri - 大魔法师 九级 6-17 14:41
我来评论>>
提问者对于答案的评价:
老兄你真行啊!我刚在csdn也找到答案了,早一点发上来找你就不会那么辛苦了,谢谢!

windows下的系统变量

在设置系统环境变量的过程中,经常会看到诸如%SystemRoot% ,%windir% ,%temp% 的字眼,当初我也不知道指的是那些目录,经过一段时间的探索,终于还是弄懂了,总结一下分享给大家:对于操作系统是XP(系统目录是windows)并安装在C盘的用户icesoul
格式:变量名=实际含义
---------------------------------------------------------------
%HOMEDRIVE% = C:\ 当前启动的系统的所在分区
%SystemRoot% = C:\WINDOWS 当前启动的系统的所在目录
%windir% = %SystemRoot% = C:\WINDOWS 当前启动的系统的所在目录
%USERPROFILE% = C:\Documents and Settings\icesoul 当前用户数据变量
%HOMEPATH% = C:\Documents and Settings\icesoul 当前用户环境变量
%temp% = C:\Documents and Settings\icesoul\Local Settings\Temp 当前用户TEMP缓存变量
%programfiles% = C:\Program Files 程序安装目录
%commonprogramfiles% = G:\Program Files\Common Files 通用文件目录
%system% = C:\WINDOWS\SYSTEM32 系统安装盘下的system32目录
%System%在98下指windows\system,2000下指winnt\system32\,XP下指windows\system32文件夹
---------------------------------------------------------------

声明:(WINDOWS XP,2K3)下系统目录为“WINDOWS”(WINDOWS 2K,98,ME)下系统目录为“WINNT”

例如:%windir%\drives 的实际路径就是 C:\WINDOWS\drives 目录。

所谓变量,就是指一个在不同环境中会有相对不同的值的、但在所有环境中都有相同约定的含义的量。

这些变量,可以在开始菜单-运行中输入,如输入%SystemRoot% ,系统会直接打开 C:\WINDOWS 目录。

如果你当前的系统是装在D盘的2000的话,上边这个变量的执行结果就是打开 D:\WINNT 目录了。

创业中的人

创业不是用钱就能堆得出来的,创业是人在创造伟大的事业,“人”是创业中最关键、最重要的组成部分。
大公司招人容易,可以在报纸上整版整版刊登招聘广告,自我吹嘘什么世界500强啊,什么福利好哇,什么培训计划、职业生涯呀,天花乱坠说得那些没见过世面的小弟弟小妹妹们人人心里痒痒的,像小狗崽儿们见到了屎…不不不,对不起说错了,像蜜蜂见到了鲜花,恨不得钻进那里面去一辈子干到老。

创业公司没有钱,要门面没门面,要排场没排场,如何才能找到好人、高人?而大多数前来找工作的人除了在乎公司支付的工资福利以外,最看重的是“安全感”,创业公司都是汪洋中的小舢板,毫无“安全感”可言;创业公司也不像大公司,没法用“品牌”、“资本”来支撑人们的信心,而摆在创业者面前痛苦的现实是:创业公司必须要有精兵强将才能去挑战大公司,去颠覆大公司,去抢占大公司所意识不到的市场机遇……

识人和用人

创业需要精兵强将,需要搜罗天下高人,最简单的方法是在网上找,你把年龄、学历、工作经历往招聘网站上一输入,电脑会自动为你配送所需要的人才,即所谓网络“速配”,在这里,“人”和你去商场里买的“货”差不多,你提出硬性指标,机器马上给你提供“速配”的结果。仔细想一想看吧,这种“速配”方法也许给猪配种可以,给创业公司配人,能行么?!

创业公司里的精兵强将是很难完全按学历、工作经历来挑选的。一个名牌大学的电脑博士,又在跨国大公司里混到了副总裁的职位,此人是不是有能力、有兴趣到你寒碜的创业公司里任高管,带领一家小公司从无到有,从小到大,从亏损到盈利,天晓得。

大公司里的人才和小公司里需要的人才是不一样的,无论他们的能力,价值观,做事风格、奋斗目标也都大不一样:

大公司里人浮于事 创业公司里没有肥肉
大公司里得能说会道 创业公司里得少说多做
大公司里层层官僚 创业公司里说干就干
大公司公务舱五星级宾馆 创业公司经济舱+如家经济房
大公司每天8小时 创业公司每天16小时
大公司一人干一件事情 创业公司一人干十件事情
大公司里阿姨扫地 创业公司里老板扫地
大公司里人人都是螺丝钉 创业公司里人人都是一条龙
……

让精兵强将们放弃大公司里舒舒服服的职位、薪资、福利,以及按步就班的升迁机会去跟你上梁山、上井冈山,夜以继日、年复一年地艰苦奋斗闹革命,凭什么啊?还不是因为你,创业者你的伟大愿景、你的崇高信念、你的个人魅力感动了他们!人们从你身上看到了比大公司更美妙的远景和机缘,于是他们“投资”了你,他们把自己的光辉前程压宝压在了你身上,前来投奔你跟你奋斗。

精兵强将们不会逆来顺受,也不是那种你发号施令他就立正转身起步向前走的人,精兵强将意味着比你强的人、和你观点不一致的人、难以驾驭的人、甚至是你不喜欢的人。

搜罗和降伏精兵强将需要有宽广的胸怀、耐性、宽容、智慧。创业者要能够从与你不同的观点、性格、能力、风格中,透视出谁是你能力的补充、提高和延伸?

创业者要能够给新人以机会:如果有人本来就是个大公司的副总,再来你的小公司里当副总,未免会有大材小用的感觉;如果有人本来只是个大公司的部门经理,到了你的小公司被提拔成了副总,他肯定会想努力搞出些名堂来大显一番身手;

创业者要有耐心:本来学电影编导的,现在满腔热情来做软件编程,不管他是多么的勤奋好学天资多高,总得给他些时间、容忍几次失败吧?本来只是个部门经理,现在当上了公司COO,第一次编写公司的运营手册,总得耐心让他去学习酝酿、反复修改;

创业者要严格把关:人招进来了并不等于招聘大功告成了,你得在试用期里仔细观察确定,此人到底是不是完全合乎你公司的需求和要求。说句难听话,世界是个大舞台,人们涂脂抹粉乔装打扮、忙忙碌碌各显神通地在各个角落里忽悠别人的钱,要在茫茫人海里找到个真正有能力、可以信赖的好人并不是一件轻而易举的容易事情。

激人和留人

曾经有个小厮大言道:A类人才找A+++类人才,B类人才找C类人才,C类人才找N类人才,N 类人才找Z类人才……

此小厮勉强算得上是个A类人才,A类的人才找A+++类人才,小厮也带了个头,虽然他自己有点像是个山寨机公司的创始人,但小厮他竟然斗胆爬到了百事可乐的镇山之王斯考利的肩膀上,踮着脚尖对准大王的耳朵大声说:“你愿意老死买糖水,还是原意跟我去改变世界?!”小厮的这句话,如醍醐灌顶让堂堂不可一世的百事可乐的全球CEO斯考利楞住了,一句话使得斯考利夜不能寐,第二天一早决定舍弃江山,投奔曹营。

小厮就是乔布斯,Apple的CEO就是这么被小乔给忽悠来的。

“人”是财富,是创业公司里最大的投资,创业公司招人和VC投资一样,有三部曲,第一步是要招进高人来(等于VC找好项目);第二步是要试人驯人,看看是不是货真价实,能不能得心应手(等于VC的尽职调查);第三步是留人走人,好人留下,不合格的走人(好的项目VC投钱,不灵的项目VC说拜拜)。

创业公司里尤其需要团队精神和凝聚力,创业公司招人不妨让它变成一件团队的事情,发动团队来挖人,每个人都分配到一定份额,要推荐进来比自己强很多的人,要他们去把以前公司里的优秀上司都挖进来,面试的过程也可以全员参与,当人人都觉得应聘者出色,而不只是老板自己看中意的人,才能被招进来。Google 最初招聘任何一个人,都必须全体员工面试,一定要获得全票赞同才能进门,所以Google初期找进来的人过五关斩六将自己都是精兵强将,听说Google 现在还坚持这个传统,不知道这种小公司的方法是不是还可以适应大公司的环境,要是新招聘一个人需要经过几百几千人的一致同意,那进来的人必须十全十美的、没有缺陷的、没有棱角的、因此也没有性格的啦。

创业公司招到了高人,要大胆地提拔使用他们,也要慷慨地激励他们,并且牢牢地留住他们,高人当然都是值钱的,但是创业公司银行账号里能够取出来收买人心的银子太少,只能画饼充饥,把公司的股份拿出来慰劳一起打天下的弟兄们,创业公司的股票犹如一张张美丽的图画,对于“信徒”、对于相信的人来说,它就是钱,而且是大钱,在不相信的人眼里,就是一文废纸。

创业公司里的股份和期权意味着公司的未来,创业者弟兄们想好了再动手,可别大意啊,尤其在你确定公司最初的股权、期权和价值的时候,如果犯了错误,日后是很难改正过来的。

股份

创业公司的股份通常是在创业最初就必须确定下来的公司权益。

最原始的股份分配方法就是按出资比例确定,你钱多能多出钱,你占股份的比例就大,我钱少出不起钱,我的股份就少甚至没有。这种以出钱比例决定股权比例的方法在VC的眼睛里是不合理的(哈哈,终于找到一件要大谢特谢VC的名堂了)。因为从VC的角度看,一个创业公司的价值,不是投进去的钱的多少,而是创业者的努力,创业者使得公司的价值不断放大,因此创业者投入很少的钱甚至不投钱,也值得让他们拿公司股权的大头,VC投进创业公司里一大笔钱,通常只会去占公司的一小部分股份,这样可以让团队看到了自己的价值,让他们会有足够的动力去拼命为创业公司的业绩增长而苦战。

举个列子说明一下,如果两个创业者各出10万元钱各占10%公司股份,而投资人投入的80万占了公司80%的股权,那么这家公司的总价值是100万,全是金钱票面的价值,“人”在这里面体现不出任何“价值”。

如果还是这两个创业者,VC出了1000万拿了20%的股份,而两个创业者没有投入实际的资金,他们投入的是Idea,加他们的全部时间和精力,在这个例子里,两位创业者各自的身价已经达到了2000万,和上面一个例子比较一下就不难看出哪一个情形中的创业者会为公司卖命更加爽气。

当然VC出了1000万只拿了20%公司股份是有一定计算和认价方法的,但这里更重要的是VC对创业者的“信念”,从某种角度说,创业是一种信念、创投也是一种信念。

当然,在VC还没有进来之前,原始的创业股东们确定自己的股份,一方面可以由出资多少决定股份的多少,另一方面也应考虑每个人的能力、作用来相应决定所持股权的比例,创业公司的股权大可不必搞平均主义,千万不要弟兄几个相互客气相互谦让,要坚持一个公司里必须有一个核心的人物,坚持贡献多的人就应该理所当然多拿些股份,贡献少能力差些的,就相应少拿些。比如说可以把50%的公司股份按照出资比例来确定,另外50%按照创始人的能力贡献差异性地分配。创业公司的股权要尽可能合理化地分配,这样才能保持团队长期合作的公平性。创业者们应该开诚布公从第一天就合理分配公司股权,关键的问题大家先说好,不留任何后患。

期权

创业公司里除了原始的创业团队以外,还会不断进来新人、新的精兵强将。公司的股份是吸引、激励、留住精兵强将的最好手段。给后来团队的股份,严格地说叫“期权”。也就是说这些股权需要经过一段时间才能成熟,比如3年。

举例来说,创业者从大公司里挖来了一个CTO,同意给他10%的股份并和他签署了他持有10%公司期权的文件。如果这个CTO人尽其能非常出色,到了第三年底,3年期权成熟,他就实际拥有了这家公司10%的股份。如果因为某些原因,这位CTO在创业公司里呆了一年就决定离开,那么他的10%的股权只成熟了 1/3,他离职的那天应该把他的所持股份做一清算,他该拿到的1/3,即3.3%的股份就应让他正式合理持有,剩下没有成熟的2/3,即6.6%应该返还给公司。返还的6.6%的公司股份是留在公司里的而不是又落入了谁的腰包,当进来了一位新的接替的CTO时,这6.6%的股份可以用作第二位CTO的期权给他(她)。

创业公司的股份和期权是动态的,一方面,随着每一次的增发(比如进来了新的投资人),每个原始股东的股份百分比都会出现相应的稀释,另一方面,每一个VC都会要求在新一轮VC投资进来时,再重新划出一部分公司股权来留作为吸引更多精兵强将加盟的“期权池”。

创业公司的股权在最初的时候可以用百分比来算,但是随着公司股本数的扩大,公司价值的增加,公司中持股人数的增多,以公司股票的绝对值而不是百分比来计算期权可能会更加合理。比如来了一个市场总监,公司决定授予价值100万元的期权,公司这时有可能已经发了上亿的股票,所以这价值100万的期权加在一起可能连1%的公司股份都不到,但是按照公司每一股的实际价值计算,这不到1%的股份的价值可能已经达到甚至超过了100万元钱。

融资也是一门艺术,创业者们在融资的时候不应该胃口太大心太黑,一下子融太多钱。按一定周期融钱,比如每12-18个月融一次,而且每一轮融资都做到成倍的溢价,每一次溢价都是新投资人对你公司的价值认可,真金白银,货真价实;在不断的溢价过程中,团队们看到了公司在成长,自己手里的股票也在增值,因此他们对你创业者的信心和崇敬之情也会不断提升;公司里老员工手里的股票的增值幅度一定比新来的员工更多,股权和期权像一座金字塔,起到了凝聚团队和稳住留住好人的作用。

斩人

创业公司像是淘金用的箩筐,大浪淘沙,把优秀的人才留下来,让他们闪闪发光,让经受不了考验的沙子冲走。炒人鱿鱼会伤人感情,产生后遗症,《资治通鉴》里也没有详细的方法指点,所以冒昧提几条建议仅供参考:

1. 充分考虑,绝不后悔。炒人鱿鱼,人家会有心灵创伤,所以即使被炒者是你原来两小无猜的朋友,你大义灭亲,果断处置,人家不一定会对你有理解之心,大家共事不成,朋友恐怕也就此了结。

2. 充分准备,后路铺好。炒人鱿鱼,此人的案头工作立刻要有人跟进,比如客户的衔接,马上派一名更加有经验的同事去打理。

3. 快刀斩乱麻,干净利落,当天通知,当天走人,不要给予诸如15天的提前通知之类,让被炒的人继续在办公室里待下去,人家知道自己已经被炒鱿鱼,心已飞走,没有谁还会安心在公司里继续卖命苦干。

4. 平静处置,以人为本。炒人要有充足理由,使人心服口服;让被炒者有发言的权利,让人有机会发泄心理不平,但是势态一定要平静,局面要控制住;对被炒者仁慈一些,盘缠给足,多给一个月工资也就是一个月工资,想想此人如果留在公司不出力,工资还得一个月一个月不停地发;公司炒人,人心惶惶,要做好安抚工作,让其它人觉得即使下回炒鱿鱼轮到了他们自己,你的大度和公正,大家都会觉得问心无愧。

5. 创业公司要时刻保持消瘦身材,切忌肥胖,即使没有人的业绩表现异常出格,公司也应该定期做业绩评定,末位淘汰。这样的话,本来三个人的工作现在两个人做,本来三个人的工资也可以发给两个人,创业公司的优越性也发挥了出来,员工的责任更大,个人收入也更高,一点不比大公司差。

2009年4月9日星期四

"MySQL"索引的分析和优化

一、什么是索引?


索引用来快速地寻找那些具有特定值的记录,所有MySQL索 引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越 多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记 录,通过索引查找记录至少要比顺序扫描记录快100倍。


假设我们创建了一个名为people的表:


CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );






然 后,我们完全随机把1000个不同name值插入到people表。在数据文件中name 列没有任何明确的次序。如果我们创建了name列的索引,MySQL将在索引中排序name列,对于索引中的每一项,MySQL在内部为它保存一个数据文 件中实际记录所在位置的“指针”。因此,如果我们要查找name等于“Mike”记录的peopleid(SQL命令为“SELECT peopleid FROM people WHERE name='Mike'; ”),MySQL能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的 peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回结果。如果没有“name”列的索引,MySQL要扫描数据文件中的所有 记录,即1000个记录!显然,需要MySQL处理的记录数量越少,则它完成任务的速度就越快。


二、索引的类型


MySQL提供多种索引类型供选择:


普通索引 :


这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:


创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);


修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);


创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );


唯一性索引:


这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种方式创建:


创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);


修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);


创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );


主键 :


主 键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。





全文索引:


MySQL从3.23.23版开 始支持全文索引和全文检索。在MySQL中,全文索引的索引 类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引,要了解更多信息,请参见MySQL documentation。


三、单列索引与多列索引


索引可以是单列索引,也可以是多列索引。下面我们通过具体的例子来说明这两种索引的区别。假设有这样一个people表:


CREATE TABLE people ( peopleid SMALLINT NOT NULL AUTO_INCREMENT,
firstname CHAR(50) NOT NULL, lastname CHAR(50) NOT NULL,
age SMALLINT NOT NULL,townid SMALLINT NOT NULL, PRIMARY KEY (peopleid) );






下面是我们插入到这个people表的数据:


这个数据片段中有四个名字为“Mikes”的人(其中两个姓Sullivans,两个姓McConnells),有两个年龄为17岁的人,还有一个名字与众不同的Joe Smith。


这 个表的主要用途是根据指定的用户姓、名以及年龄返回相应的peopleid。例如,我们可 能需要查找姓名为Mike Sullivan、年龄17岁用户的peopleid(SQL命令为SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age=17;)。由于我们不想让MySQL每次执行查询就去扫描整个表,这里需要考虑运用索引。


首先,我们可以考虑在单个 列上创建索引,比如firstname、lastname或者 age列。如果我们创建firstname列的索引(ALTER TABLE people ADD INDEX firstname (firstname);),MySQL将通过这个索引迅速把搜索范围限制到那些firstname='Mike'的记录,然后再在这个“中间结果集”上 进行其他条件的搜索:它首先排除那些lastname不等于“Sullivan”的记录,然后排除那些age不等于17的记录。当记录满足所有搜索条件之 后,MySQL就返回最终的搜索结果。


由于建立了firstname列的索引,与执行表的完全扫描相比,MySQL的效率提 高了很 多,但我们要求MySQL扫描的记录数量仍旧远远超过了实际所需要的。虽然我们可以删除firstname列上的索引,再创建lastname或者age 列的索引,但总地看来,不论在哪个列上创建索引搜索效率仍旧相似。


为了提高搜索效率,我们需要考虑运用多列索引。如果为firstname、lastname和age这三个列创建一个多列索引,MySQL只需一次检索就能够找出正确的结果!下面是创建这个多列索引的SQL命令:


ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);






由于索引文件以B-树格式保存,MySQL能够立即转到合适的firstname,然后再转到合适的lastname,最后转到合适的age。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录!


那 么,如果在firstname、lastname、age这三个列上分别创建单列索引,效 果是否和创建一个firstname、lastname、age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使 用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于 firstname、lastname、age这三个列上的多列索引。


四、最左前缀


多列索引还有 另外一个优点,它通过称为最左前缀(Leftmost Prefixing)的概念体现出来。继续考虑前面的例子,现在我们有一个firstname、lastname、age列上的多列索引,我们称这个索引 为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用fname_lname_age索引:


firstname,lastname,agefirstname,lastnamefirstname






从另一方面理解,它相当于我们创建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引:


SELECT peopleid FROM people
WHERE firstname='Mike' AND lastname='Sullivan' AND age='17';
SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan';
SELECT peopleid FROM people WHERE firstname='Mike';
The following queries cannot use the index at all:
SELECT peopleid FROM people WHERE lastname='Sullivan';
SELECT peopleid FROM people WHERE age='17';
SELECT peopleid FROM people WHERE lastname='Sullivan' AND age='17';


五、选择索引列


在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。请看下面这个查询:


SELECT age ## 不使用索引
FROM people WHERE firstname='Mike' ## 考虑使用索引
AND lastname='Sullivan' ## 考虑使用索引






这个查询与前面的查询略有不同,但仍属于简单查询。由于age是在SELECT部分被引用,MySQL不会用它来限制列选择操作。因此,对于这个查询来说,创建age列的索引没有什么必要。下面是一个更复杂的例子:


SELECT people.age, ##不使用索引
town.name ##不使用索引
FROM people LEFT JOIN town ON
people.townid=town.townid ##考虑使用索引
WHERE firstname='Mike' ##考虑使用索引
AND lastname='Sullivan' ##考虑使用索引


与 前面的例子一样,由于firstname和lastname出现在WHERE子句中,因此 这两个列仍旧有创建索引的必要。除此之外,由于town表的townid列出现在join子句中,因此我们需要考虑创建该列的索引。那么,我们是否可以简 单地认为应该索引WHERE子句和join子句中出现的每一个列呢?差不多如此,但并不完全。我们还必须考虑到对列进行比较的操作符类型。MySQL只有 对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索 引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE 'Mich%'; ”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE '%ike'; ”这个查询不会使用索引。

mysql limit 查询优化

MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。

同样是取10条数据
select * from yanxue8_visit limit 10000,10 和
select * from yanxue8_visit limit 0,10

就不是一个数量级别的。

网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。

文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核 (3GHZ) +4G内存 mysql 5.0.19)

1、offset比较小的时候。

select * from yanxue8_visit limit 10,10

多次运行,时间保持在0.0004-0.0005之间
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10

多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。

2、offset大的时候。
select * from yanxue8_visit limit 10000,10

多次运行,时间保持在0.0187左右
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10

多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

以后要注意改正自己的limit语句,优化一下mysql了

关于我

我的照片
从事计算机软件应用软件开发,4年经验,做过若干个项目,涉及电信、安防、视频等领域。

他/她/它 来过