Want to read Slashdot from your mobile device? Point it at m.slashdot.org and keep reading!

 



Forgot your password?
typodupeerror
×
Technology

MySQL 4 - Is it Stable? 547

Shaklee3 asks: "I have been running version 3 of MySQL on the company's website for quite a while now. We recently ran into a problem where we needed the new features of version 4 that uses the UNION clause. We are running FreeBSD 4.6-STABLE and Apache 1.3.26. I know they reccomend not using it in a production environment yet, but from what I hear it is already being used on a few major websites. Does anyone have experience with version 4, and is it stable enough to run on a high traffic site?" If you feel MySQL isn't ready for prime-time, where specifically do you feel it needs improvement?
This discussion has been archived. No new comments can be posted.

MySQL 4 - Is it Stable?

Comments Filter:
  • by Hollinger ( 16202 ) <michael AT hollinger DOT net> on Friday August 02, 2002 @08:38AM (#3997883) Homepage Journal
    Is Sub-selects and foreign keys. These are probably the two biggest features I've constantly found myself needing / wanting.
    • by PunchMonkey ( 261983 ) on Friday August 02, 2002 @08:51AM (#3997946) Homepage
      For Christmas? I want views!!! Precious views!! I need to secure certain data from the prying eyes of account managers and sales folk. So everynight I'm rebuilding these summary tables for each user! Argh!!!

      There's no such thing as row-level security.... my kingdom for views in mysql!!!
      • I want views!!! Precious views!! I need to secure certain data from the prying eyes of account managers and sales folk.

        Sounds to me like you're really trying to hammer that socket-head capscrew into place, rather than finding an appropriate Allen wrench.

        It's amazing to me how many people in the open source community continually try to force mySQL into doing jobs it's clearly not up to. This is especially puzzling, since there *are* good, modern, high-performance, high-function databases out there, things like Postgresql, Interbase,and the Sleepycat Berkeley DB (not SQL, but really fast and solid) among many others.

        For quick, dirty, and fast, without the hassles of dealing with SQL at all, there are options like NoSQL [linux.it] and Starbase [harvard.edu], both of which are based on the Stream/Modifier concept of the original /rdb [rsw.com] that allows fast, flexible database operations and allowing the use of the full power of the Unix environment. ( It's easy, leverages a zillion other existing tools, and everything you learn is directly applicable to anything else you do in a Unix environment.)

        It seems most people want SQL just because it somehow legitimizes their project as "serious", when in reality, it often just adds undesirable complexity and support cost. SQL is often unnecessary and actually undesirable, if you allow yourself to consider the possible benefits of NOT using a SQL database.

        Also, keep in mind that *any* database (and especially ones that are already very fast,like BerkeleyDB or Starbase) is lighting fast in RAM, and memory is now cheap enough to make putting the whole DB in memory a very do-able thing: A gigabyte or several of database is BIG, and easily supportable on very affordable server hardware.

        And of course, there is a reason those commercial database companies exist: They often offer capabilities that open source users may never have. I am looking right now at a new application which will be *much* faster and cheaper based on Intersystems' unique Cache database than it eould be on any of the more common big names. It's important to choose the right tool for the job. (In this case, I need lots of transactions in a very large sparsely populated database, Cache is excellent there, an order of magnitude better than Oracle or DB2, which is why Cache is the leading DB choice for electronic medical records systems, and has been for years.)

        MySQL is not the answer to every database problem. Or even most of them, truth be told. Personally, I find it to be a minimally competent, fussy, and underpowered tool. It's good for some things, but to be honest, I've always thought its appeal had more to do with being the first real open source SQL DB than with being good.

        As always, this boils down to choosing the right tool for the job. Not exactly rocket science, but something way too many people don't bother to do.
        • by Tadghe ( 18215 ) on Friday August 02, 2002 @12:03PM (#3999257) Homepage
          "It's amazing to me how many people in the open source community continually try to force mySQL into doing jobs it's clearly not up to"

          It's amazing to me how often people who make this sort of comment miss the boat so to speak. People stick with MySQL as opposed to switching to PostgreSQL, SapDB,Firebird and the like for the same reason that VB programmers tend to stick with VB, the same reason that Susie Homeuser has stuck with Windows all these years. It has very very little to do with mySQL being "better" than the others. People stick with Mysql because it's quick to learn, easy to setup and reasonably scalable for many applications. People are staying with mySQL because they are comfortable with it, it's already installed and they know how to use it.

          Want people to switch to PostgreSQL or (Heaven forbid) *SapDB, then give Joe Admin or Derek Programmer a UI to them that works like Mysql, then make them as easy to install/backup/restore as Mysql.

          At the risk of being labled a troll, realize that mySQL will continue to be the OSS DB of choice for the hoards so long as it continues to be the quickest, easiest way to setup a (semi) RDBMS.

          *SapDB is a (IMHO) a pile of steaming speghetti code that I would not wish on my worst enemy. Try taking a look at the code (www.sapdb.org) or if you lazy, just read some of the messages on the SapDB Yahoo group (http://groups.yahoo.com/group/sapdb-general/messa ge/909) for instance.
    • So use a real database: Oracle, Sybase, MSSQL, Postgres, DB2 (etc, etc) all have such features.
    • I agree - without these features I don't call MySQL database. I'm doing some SIMPLE intranetwork groupware (mainly managing information about companies, people and contacts) and some of my SQL queries are 4 lines long and has got 3 sub-selects (I use PostgreSQL and I'm VERY happy with it).
      • by Daniel Dvorkin ( 106857 ) on Friday August 02, 2002 @10:49AM (#3998667) Homepage Journal
        without these features I don't call MySQL database
        [sigh] Any method of storing data electronically is a database. MySQL is a database, Oracle is a database, PostgreSQL is a database, Access (God help me) is a database, a flat text file is a database, a bunch of random text files scattered all over your hard drive that you have to search with grep constitute a database.

        Now, if you want to argue that MySQL isn't a very good database, that's your business. (I disagree; I make my living as a MySQL DBA, and love it. But you have a right to your own opinion.) But saying that it's not a database because it doesn't have feature x is like saying that a car without cruise control isn't a car.
    • by kylant ( 527449 ) on Friday August 02, 2002 @08:59AM (#3997982)
      MySQL includes the fabulous InnoDB [innodb.com] which offers foreign keys, great performance and row-level locking.
    • by Karora ( 214807 ) on Friday August 02, 2002 @09:01AM (#3997995) Homepage
      Is Sub-selects and foreign keys. These are probably the two biggest features I've constantly found myself needing / wanting.

      Then you probably should be using PostgreSQL, which has had these features for some time. It also has UNION, functional languages, extensible types, full transaction support, SQL standard syntax, unlimited row length...

      Stick with MySQL when performance is critical and you want to do straight SELECTs from simple tables with few joins and very few updates.

      Go with PostgreSQL if you want an RDBMS that supports transactions, that scales when writers and readers both use the DB at the same time, if you want to support complex queries or if robustness, programmability and configurability are important to you.

      • If you need indexed tables and performance is critical then why not use this [sleepycat.com] instead of mySQL? I mean, for the limited SQL syntax that is actually available in mySQL, you may as well not bother using it.
        • umm... because.... (Score:2, Informative)

          by Ender Ryan ( 79406 )
          Because lots of times you have software that uses SQL to talk to it's database backend. Or you may need a database that talks to a number of different servers, etc. Or possibly you may need to migrate to a bigger better database in the future, like DB2 or Oracle.

          • If you really already have SQL, then chances that it runs on Mysql are very small. Really, for the limited subset of SQL that Mysql supports, using something SQL based is not worth the trouble.

            In that case, better use some kind of file-based storage yourself (such as dbm files) and do it really fast and low level.
      • Performance (Score:5, Informative)

        by ghum ( 109642 ) <freedomxx3...19. ... pamgourmet...com> on Friday August 02, 2002 @09:26AM (#3998119)

        Stick with MySQL when performance is critical and you want to do straight SELECTs from simple tables with few joins and very few updates

        "Postgresql is slow" is a very popular myth and urban legend.

        It even was a true myth - with older versions of Postgresql. Since 7.1.3 big improvements in the query-optimizer gave Postgresql big speed improvements - without stripping any of it's features.

        7.2.1 is lightning fast.


        Postgresql Tips for today: Do check out
        • the COMMENT on table.column command
        • the \d+ extended information display
        • the CASE WHEN ... THEN .. ELSE.. ENDIF construct
        • Good tips. How about stored procedure searches that returns rows without jumping thru hoops and reselect with the OID's?
        • * the CASE WHEN ... THEN .. ELSE.. ENDIF construct
          Should it not be CASE WHEN ... THEN ... ELSE ... END?
      • by rtaylor ( 70602 ) on Friday August 02, 2002 @10:31AM (#3998511) Homepage
        Regarding performance:

        Postgresql starts out slower in comparison, but the curve degrades much less when you throw more people at it.

        For ~10 simultaneous connections or less, MySQL will be faster in simple situations (simple tables, few joins, few updates / deletes). After ~10 connections Postgresql starts to shine.

        After about 200 to 300 connections Postgresql seems to be a touch faster than Oracle, but the difference in speed isn't enough to make either a choice over the other.

        Anyway, great to see a MySQL release coming up. We regularly use it for batch analysis (dedicated machine, single connection, large record sets, selects only) but are debating moving to BDBs for speed reasons.
    • Um. Along with my two front teeth, I want
      STORED PROCEDURES

      Yes, I see it on the roadmap for 4.2.... but dammit, I'm into instant gratification...
    • by PacketMaster ( 65250 ) on Friday August 02, 2002 @09:07AM (#3998023) Homepage
      Foreign keys are available in InnoDB I believe. InnoDB is quite stable and is going to be part of the "Standard" package in 4.0. From what I understood at O'Reilly OSCon about nested selects is that they're slated to be in the 4.1 release due sometime by the end of the year. I asked why they hadn't been included until now and was told that none of the paying customer had ever asked for it so it wasn't on the top priority list and no one from the free software community ever tried to submit a patch to include nested selects. It's the same story - if you want a feature that's not there don't moan, just code it. MySQL is a great product IMHO and I completely understand that Monty and crew need to eat so the commercial licensees come first.
    • Foreign Keys are already there.
      Use the InnoDB type.
      MySQL-4.0.2 just added the preservation of foreign key constraints through an alter table command.
      As for sub-selects, use a tmp table. I know it is a pain in the rear, but it works.
    • Ngggh! (Score:2, Funny)

      by Anonymous Coward

      As a troll, finding a story titled "Is MySQL stable?" on the front page is an unexpected delight. In fact, I think I just creamed myself. Please consider adding a few other stories, such as:

      • *BSD - is it dead?
      • Natalie Portman - star of stage, screen and slashdot - interviewed.
      • Anime, is it lame and gay?
      • VA Linux - just how much money is left?
  • My Only Wish (Score:2, Interesting)

    by Anonymous Coward
    Replication....either make it more error resistant, or better docs on how to resolve the errors.

    Views....everybody else has them, why can't we? Views might be the sole reason I get pushed into oracle.
  • by Clay Mitchell ( 43630 ) on Friday August 02, 2002 @08:40AM (#3997896) Homepage
    Does it yet support the same SQL syntax as RDBMS like Oracle or Postgres? It's rather annoying to have to go look up some weird function to format a date in MySQL when TO_DATE() works so well on so many other databases. MySQL is fast, especially for straight queries, but my god, it's functions give me a headache.

    Oh yeah, does it support transaction locking yet?
    • I was under the impression that with InnoDB and BDB tables, transaction locking was supported..

      A quick quote:

      For InnoDB and BDB tables, MySQL only uses table locking if you explicitly lock the table with LOCK TABLES. For these table types we recommend you to not use LOCK TABLES at all, because InnoDB uses automatic row level locking and BDB uses page level locking to ensure transaction isolation.
      • Yes, but that throws the speed advantage out the window. Personal benchmarks show a significant speed disadvantage compared to Postgresql and Oracle when MySQL is used in transaction safe modes.

        Anyway, my biggest beaf with MySQL is silent failure. If the table type doesn't support transactions, but the code expects and issues the statements to use them then MySQL (used to?) silently ignore the command and continue without using transactions.

        This makes debugging insanely difficult (doesn't do what is expected) -- which means a larger hardware purchase is cheaper than the increased development time.
  • postgres (Score:2, Flamebait)

    by GigsVT ( 208848 )
    If you find yourself wanting more features, then ditch the toy DB and get something better like Postgresql.

    I don't understand why people like MySQL so much when postgres is just as easy to set up and deal with, and has a much more complete feature set.
    • Re:postgres (Score:4, Interesting)

      by CynicTheHedgehog ( 261139 ) on Friday August 02, 2002 @08:47AM (#3997925) Homepage
      Don't forget that PostgreSQL is faster than most people realize. I read a benchmark that showed that on some queries it's even significantly faster than Oracle. Of course, on other queries it was significantly slower, but it all comes out in the wash. What was interesting is that while MySQL was faster on a lot of queries, Oracle and PostgreSQL actually outperformed it on a couple. What I want to know is if there are any businesses out there that can load balance PostgreSQL and have a proven track record for support similar to Oracle's "Gold" level (or whatever they call it). When all is said in done that has got to be cheaper than Oracle licenses.
    • I don't mean to flame/troll, but I don't get it either...

      Not to mention that Postgres has been more open much longer than MySQL has been.

      I personally use Interbase, but have used both Postgres and MySQL.
    • Re:postgres (Score:2, Informative)

      by sc00ch ( 254070 )
      Just as easy to setup? Have you tried installing postgresql on a windows box? Currently, the only solution they offer is by using Cygwin and there is no simple installation program. I eventually got it running but i would certainly not say it was as easy as mysql on a win32 platform. A lot of people i'm sure are turned away by this...

      Remember that many developers like to use windows and dont have the money to set up a seperate box for running a database.
    • Re:postgres (Score:3, Interesting)

      Basically, fulltext indexing is why I'm still using MySQL...
  • by Anonymous Coward on Friday August 02, 2002 @08:41AM (#3997901)
    Running High traffic webboarding system, online stores, other various web apps running off of it and I have not had one problem related to mysql 4 not being stable.

    I think it was good enough for production the day it came out, but they just wanted to keep it in Alpha mode for a while just in case...
  • by cyberlotnet ( 182742 ) on Friday August 02, 2002 @08:43AM (#3997907) Homepage Journal
    Its the endless battle..

    Its worse then sitting in a room full of RedNecks fighting over which car is better.. Ford Or Chevy, with some silly idiot trying to throw in a Toyota once in a while..

    Rephrase for slashdot

    Its worse then sitting in a room full of SysAdmins fighting over which DB is better, Mysql Or Postgres, with some silly geek trying to throw in a Oracle once in a while..
    • Hmm...silly geeks throwing in oracle?

      I worked on a couple of very large sites a few years ago (OK Magazine and Television-X the fantasy channels website - fantasy121.com) and the only databases which would scale to what we wanted with no problems and serious speed problems were MSSQL and Oracle...and not liking M$ stuff (security holes...monopolies yada yada yada) we chose oracle and never looked back.

      For huge sites I would heartily reccommend it...and the cross platform java admin/setup tools were a brilliant touch.

      O.k. it costs a bomb...but to a certain extent you gets what you pays for (although for free (as in beer) MySQL gives you pretty good bang for your buck).

      So what if oracle isn't open source...it's still one of the best.
      • It's silly, because it costs so much, which makes it totally impractical for a large range of purposes.

        It's silly, because we hires a team of Oracle approved contractors, and after six months they didn't even have a dialog box working. So Oracle replaced them with another bunch, and they quickly go stuck too.

        OTOH, some things only work with Oracle. If you need them, then that's what you have to use, warts and all.

        What is better depends on what you need.

  • by Phil John ( 576633 ) <philNO@SPAMwebstarsltd.com> on Friday August 02, 2002 @08:44AM (#3997910)
    I've been following the developments very closely and have had it running fine on my development box (P3, Win2K Pro) for over a month without a reboot.

    I've also had a test site live to the world running off my broadband connection, so I could test stuff from work etc. and I haven't found any problems yet.

    However I don't know how it would scale to a large site (the test site was 34 tables and only around 50k records in total).

    I think a lot of the "don't use this on a live site" stuff is just to cover their own asses in case something goes wrong.
  • by wenzi ( 6465 ) on Friday August 02, 2002 @08:45AM (#3997915) Homepage
    I have been using it for quite some time on a large active database. I have not had any problems with corruption, and it has been solid as a rock so far.

    Why use mysql instead of Postgres ? Speed....
    • Speed? (Score:3, Funny)

      by Srin Tuar ( 147269 )

      Why use mysql instead of Postgres ? Speed....

      Ah, I see, you have the unusual requirement that your database must be slow...

      :)

  • by rsmah ( 518909 ) <rmah.pobox@com~> on Friday August 02, 2002 @08:55AM (#3997961)
    MySQL's popularity can be traced back to the popularity of mSQL and MySQL's compatability with it. It's widespread use, however, is like the spread of Microsoft Windows or Visual Basic. Some people *believe* that MySQL is somehow "easier" or "faster", but that's just not the case.

    If you are a MySQL user and don't understand why people who know databases don't like it, you simply have to consider MySQL's lack of common SQL DBMS features such as:

    • Transactions
    • Subselects
    • Views
    • Triggers
    • Constraints
    • Foreign Keys
    • Etc, etc, etc.
    You may not understand why such features are important, but that doesn't mean that having them available for use when you do finally learn about them isn't important. A DBMS without such common features is like driving a car without seat belts and air bags. You may get where you want to go, but woe to you if you run into any trouble along the way.

    BTW, yes, I know that Mysql supports foreign keys and transactions if you use innondb tables. But the point of using a SQL database is that you shouldn't have to worry about the underlying data representation.

    Cheers,
    Rob

    • You can likely change to a different database later as long as you don't use proprietary functions. Make sure you write standard SQL.

      And before you say that what you write is SQL... You might not be. Check a few of your statements with an SQL Validator [mimer.com]
    • I totally agree. Using mysql is going to be an exercise in frustration for anyone who has used a real rdbms before. Some things like foreign keys you can do without in your careful (just hope no one else on your team executes a query that orphans records in another table). Things like subselects and views on the other hand are requirements(MSSQL has a really cool thing called partitioned views...awesome for storing dated data). It totally baffles me that mysql didn't even have the UNION clause until ver. 4. Can you use SQL 92 syntax yet and do your joins in the FROM clause or do you still have to do them in the WHERE clause?
      • Can you ... do your joins in the FROM clause or do you still have to do them in the WHERE clause?
        You mean like this?

        SELECT * FROM table1 t1 LEFT JOIN table2 t2 USING (common_column) WHERE t1.column1=7

        If so, yes. You don't even need MySQL 4; 3.23 can do it just fine (though it may be missing a few variations).
        • Correct, or some variation there of:

          SELECT *
          FROM tbl1 JOIN tbl2 ON tbl1.a = tbl2.a
          WHERE tbl1.b = 1

          Slightly OT, you know something that really bugs about rdbms in general? It's that their query processors still aren't as good as they should be. Now if we can agree that this query should return the same results as the previous query:

          SELECT *
          FROM tbl1, tbl2
          WHERE tbl1.a = tbl2.a
          AND tbl1.b = 1

          You would think that the query processor would turn these into the same internal data retrieval algorithm, but on many databases it doesn't. On one vendors database in particular one of these queries would run quickly while the other would run out of temp space. It will be nice when vendors really start to get this stuff right.
    • Everyone knows that MySQL is not a good choice for heavy lifting, it's much better for lightweight applications where you have a simple database with lots of SELECTs and not much updating. Get used to it. Why must you force it to fit a different mold as well? The reason many of those features were left out is because they resulted in design decisions that slowed the thing down. And yes, MySQL is faster than any other database, except perhaps Oracle when it's finely tuned, but if you have the time and expertise and money for that, chances are MySQL wasn't the database you wanted anyway.

      I've used PostgreSQL, a highly SQL compliant DB, and I've used MySQL. I moved to PGSQL because it was a "real RDBMS." After a while, I ended up going back to MySQL because I wasn't using any of the features that made PostgreSQL more desirable. I was writing a fairly simple WWW application.

      Many people don't care about setting up a fancy RDBMS, they just want a few tables that they can easily commit to and select from, like a glorified Berkely DB. What's wrong with that?
      • I've used PostgreSQL, a highly SQL compliant DB, and I've used MySQL. I moved to PGSQL because it was a "real RDBMS." After a while, I ended up going back to MySQL because I wasn't using any of the features that made PostgreSQL more desirable. I was writing a fairly simple WWW application.

        Mind if I ask what training (preferably formal education including theory as well as practice) you've had in doing database work?

        Once you've learned to properly use the fancier features, it's hard to do without them. Otherwise you end up with more error states (sometimes meaning the app going down in the middle of the business day for no apparent reason -- I've seen this happen In Real Life due to relational integrity failures the database should have prevented), reduced speed (because of calculations that could have been done by the database itself via stored procedures are being done by the client) and the need to make assertions which should be enforced by the underlying data storage layer. If all you want or need is a glorified Berkely DB, that's fine -- but stay away from anything mission-critical.

        The thing I'm really worried about here is the "if all you have is a hammer" syndrome. All too many folks who know how to use simple databases but not how to take advantage of the "fancier" features all too frequently decide that those features aren't needed in places where they really are vitally important, resulting in Bad Things happening. The blanked warnings aren't because MySQL can't meet your needs when all you need is a prettied-up db3; they're there because if you trust it to something mission critical, you can be putting not only yourself but whoever inherits maintaining and firefighting your system through hell.
    • by Anonymous Coward on Friday August 02, 2002 @09:36AM (#3998182)
      I am more than a little experienced with "real" RDBMS packages (using MS SQL, DB/2 and Oracle professionally and occasionally personally), and I *believe* that MySQL is somehow "faster".

      Why? Because, in general, _it is_. Easier? Easier than Oracle and perhaps Postgres. Toss in some of the third party apps (MySqlFront comes immediately to mind), and it does get quite a lot "easier".

      If you are someone who "knows databases", and think you "shouldn't have to worry about the underlying data representation", you are not, in fact, someone who "knows databases". From a MS SQL standpoint: if you have not already married your copy of Delaney's Inside SQL Server (HEAVY on the "underlying data representation"), you do not, in fact, _know_ that RDBMS.

      It is such a hugely important area of knowledge when developing (and more particularly, designing) against a particular RDBMS that I am just shy of saying that statement paints you as an idiot.

      Views: They're coming. I hate waiting for it, but I can wait.

      Triggers: Showing up with Stored Procs? Who knows. Keep your business logic in the middle tier where it belongs and you invalidate 99% of the reasons triggers are used. (Yes, I know there are exceptions.)

      Constraints: Business Logic. Middle Tier.

      Stored Procedures (oh wait, this wasn't on your list!) This is annoying mostly to people who don't implement a robust middle tier. But it's coming, too.

      ANSI compliance: Far more annoying than any of these other things are the few areas where they still have stupid custom functions rather than simply implementing what the standards say.

      But, frankly, the situations where the lack of any of these features are lethal to a project are few and far between. (Lack of views and stored procedures for a DB-centric implementation of row-level security, something very few people actually do. Lack of triggers for building complete audit trails that direct DB users cannot sidestep... something else very few actually do...)

      Why do I, someone who "knows databases", use and _deploy professionally and commercially_ MySQL?

      Because it's fast, stable, and they [seem] to care a whole hell of a lot more about implementing a feature in a manner which is fast and stable rather than implementing it ASAP just so they can add a few marks to their report card.

      I have run into two, count 'em, two, areas where MySQL's "lack of features" posed a problem for me. Because I am a _firm believer_ in not tring to make the database do things it is not intended to do, I moved those two things into the very solid middle tier and the problem was solved.

      I despised MySQL until this past year or so. It was fairly obviously slanted towards driving websites rather than being a serious RDBMS.

      That has changed, is continuing to change and, by all accounts, will continue changing with every release.

      It is a pity that some people who "know databases" cannot change their narrow tunnel vision as well.
      • You don't "know databases" if you think that many of the things you listed belong in the middle tier. If you "knew databases," you'd know that it's the job of the database to perform the final check on data integrity before ANYTHING goes into the database -- the middle tier should do business logic checking as necessary, but definitely not something so low level as foreign keys. Also, what if you have many middle tiers from many different places, and what if you screw up in your middle tier? You won't actually know that the data is screwed until a real problem crops up or you notice the table mysteriously growing.

        I'd hate to see how ugly your middle tier is when it has to do like 10 DELETE statements since there is no cascading and 5 SELECTS before an INSERT to double check the fields which normally would be foreign keys. In fact, I'd bet that you probably don't do the checking in the middle tier, since that would be retarded and you just bank on the data being consistent, even if somehow your variable with the ID gets corrupted or someone else comes in and tweaks your code.

        Or, you're a troll.
      • Hear, hear!

        I would mod you up if I could. Because of their large feature set, giant RDBMS's like Oracle often end up doing things that belong in the middle tier. I'm glad someone with so much real knowledge was able to speak up in favor of MySQL.
    • I think I'm in a position a lot of people are in - I'm a back-end coder, who doesn't specialise in databases. Usually working in a team, there will be some database specialist, and I'll lead the team designing the engine that uses it, and someone else will lead the front-end. So I know some about databases, but I'm not an expert.

      I also use databases for some of my own stuff. I've found mySQL to cover everything I need to do. On a rare occasion, I have to push the boundaries a little, but that's not impossible with a little design tweaking.

      So my question is, I would like to learn more about these extra features - I know what most of them are and do, but I don't have the database structure knowledge to know what situations they should be used in, and more specifically, how to design databases to begin with to take advantage of them.

      Online resources would be preferred, I don't want to spend $50 on a book I won't use THAT much, but they will certainly be considered.

      Thanks,

      Fross
    • MySQL's popularity can be traced back to the popularity of mSQL and MySQL's compatability with it. It's widespread use, however, is like the spread of Microsoft Windows or Visual Basic. Some people *believe* that MySQL is somehow "easier" or "faster", but that's just not the case.

      Mysql nay-sayers on slashdot always talk about how Postgres blows Mysql out of the water, but I've never seen any evidence of that.

      So, take the Pepsi challenge with me...

      Postgres Faster? Well, not as of a point version ago:

      http://www.mysql.com/information/benchmarks.html [mysql.com]

      Let's not forget about the joys of Postgres and "VACUUM" that locks the table. (Okay, in newer versions it doesn't have to lock the table, but then it slows everything to a crawl on a busy server)

      Also, clearly just from reading slashdot, you would know there's far more people using Mysql than Postgres, far more "grassroots" open source type helpful people that everyone on slashdot supposedly loves.

      Finally, compare the fucking manuals and try to argue how Postgres has an easier learning curve than Mysql. When you search the postgres site it returns a bunch of poorly named html documents, for Christ's sake.

      Though I would agree that all of the SQL functions you've mentioned are useful, they aren't necessarily so for an enterprise. And honestly, not too many people in big business are using PostgresSQL. They were either duped into using SQL Server because they're MS slaves, or they use the Far Superior Oracle, and pay for Larry Elison's 20" spoke rims on his rich-dude pimp-mobile.
      • by Jason Earl ( 1894 ) on Friday August 02, 2002 @12:05PM (#3999270) Homepage Journal

        The so-called MySQL benchmark compares MySQL and other databases doing a whole pile of somewhat obscure database functions one at a time. If your database only has one user, and you spend a lot of time truncating tables, then MySQL is probably the correct choice. For a much more realistic benchmark try here [phpbuilder.com]. After looking at MySQL's benchmarks I had to conclude that either the MySQL developers are ridiculously naive about real world data loads or that they are being deliberately deceitful. No one cares how a database performs when there is one single user.

        MySQL is a fine database if your are creating an appliation that is read intensive and that doesn't need any of PostgreSQL's more advanced features.

  • Seriously, most SQL databases have moved on past the stage mySQL is at. The features you're asking for are standard in almost every other SQL-based product available.

    I mean, it's like trying to use a calculator without an 'x^y' button. Sure, the calculator might be smaller and faster but do you really want to be hitting '*' hundreds of times when you could do '^' once?

    You really are living in database technology yesterbidecade. Relational database software has moved on a lot since then - why not take advantage of it?
  • Does anyone know when it will become the official release? My Hosting company won't upgrade until it's marked stable, understandably, but I'd love to know when that will be.
  • by jsonmez ( 544764 ) on Friday August 02, 2002 @08:58AM (#3997975)
    This is just a rumor but I heard that this one guy, well he ran MYSQL4 and his arm blew off. I mean the whole thing, I am talking fingers and hands and everything.
  • new feature? (Score:3, Informative)

    by sql*kitten ( 1359 ) on Friday August 02, 2002 @09:00AM (#3997985)
    new features of version 4 that uses the UNION clause.

    As far as I know, IBM's System/R had UNION in 1974 and Oracle (back when the company was called Relational Software) had it in 1979...
    • Re:new feature? (Score:3, Interesting)

      by jabbo ( 860 )
      YES!!!

      THANK YOU! I was wondering how long it would be before someone noted that the challenge of UNION is akin to that of the '+' operator in Lisp...

      I run all my robust projects on PostgreSQL, and the data marts on MySQL. MySQL is just a flatfile database for people too lazy to use those :-)

      Lately I've been involved in some community projects where they're currently trapped with MySQL, thank god every reasonable piece of PHP software (PHP! you know, the 'k1dd1e language'!) is now moving towards abstraction and PostgreSQL support too.

      Subselects are another obvious lack -- I have more respect for MySQL's paying customers (eg. I believe now that they understand what MySQL is for, perhaps better even than the developers!) because that indicates to me that it is paid for as a straight data mart, NEVER as an Oracle substitute. Thank god someone sees this truth.
  • by psychofox ( 92356 ) on Friday August 02, 2002 @09:03AM (#3998007)
    The developers warn you that it is not ready for Production use. And you don't believe them...

    I promise not not to say I told you so.

  • I've been dying to dump our M$ SqlServer base for MySql for a long time now. Once MySql (finally) integrates stored procedures (which I think is now v4.2), that will happen, but not before.

    I've heard the arguments for not needing stored procs before, but we have a application environment that is spread across multiple language and technology platforms and cannot afford the duplication in database logic.

    Of course, if any one has some better suggestions, I'd be more than happy to hear them.
  • by nwetters ( 93281 ) <ngourlayNO@SPAMgmail.com> on Friday August 02, 2002 @09:13AM (#3998052) Homepage

    I'd always thought MySQL was a fast, simple database until I built a Type-II JDBC driver [sf.net] for it.

    Because the API does not allow more than one result (MYSQL_RES structure) per connection, and the client libraries are not thread safe by default, any Java classes must be synchronized on the connection. In addition, all rows in a result must be retrieved completely using mysql_store_result rather than the more network efficient mysql_use_result.

    The JDBC specification insists (sensibly, in my opinion) that Statement objects be thread safe. The necessary synchronization and use of mysql_store_result severely limits the speed of any mutithreaded application sharing a connection, and probably discounts the speed benefits of MySQL over other free databases.

    I would guess the same problems exist with other multithreaded languages using MySQL, and developers should consider these limitations before blindly agrreing with MySQL propaganda that the database if faster than its competitors for running web applications.

  • I (heart) MySQL (Score:4, Informative)

    by defile ( 1059 ) on Friday August 02, 2002 @09:14AM (#3998057) Homepage Journal

    MySQL's limitations are not a serious problem for me. Most database accesses in my applications are consolidated in a separate layer. It is very simple to duplicate features which may be missing from MySQL.

    The support behind MySQL is outstanding, both from the mailing list and paid MySQL support. MySQL is extremely simple to set up and can handle quite impressive loads.

    To keep score, MySQL + Innobase supports transactions (w/ row level locks and multi-versioning), foreign keys. 4.0 introduces UNION statements and a supposedly cool query cache. Pretty soon should come subqueries, stored procedures, etc.

    That said, I've not used 4.0 in a production environment. What we have right now (3.23.51-max) seems to be doing the job just fine.

  • No! (Score:5, Insightful)

    by CaptainZapp ( 182233 ) on Friday August 02, 2002 @09:16AM (#3998067) Homepage
    Being more of a Postgresql kind of guy, I really can't comment on the virtues of MySQL V4.

    Having dealt with a lot of databases in a production environment here's my take:

    You absolutely don't want to run any database which is designated "not stable" in a production environment.

    Or put it another way: If I'm your boss I won't fire you for lacking features of the database. If we decided on this database engine we work around the shortcomings. But I'll have your ass sacked in no time if you install an unstable version of the product and corrupt the database in this process.

    If that seems too harsh: You may explain to me the business reason and the risks associated and get it in writing that your management is aware of what's going on and knows of the risks.

    • Re:No! (Score:4, Insightful)

      by budgenator ( 254554 ) on Friday August 02, 2002 @11:31AM (#3999021) Journal
      But I'll have your ass sacked in no time if you install an unstable version of the product and corrupt the database in this process. The question revolved more arround setting up a separate DB with data from the production DB primarily for reporting. It might be profitable for him to set up a sandbox server with MySQL 4.0 and throw the queries from the live system at it. Prove it works stable at 2 or 3 times the present load, then add in the features you want and retest. The end result is he might not know if its stable for my apps or not but he'll now if its stable for his. If something does blow up, the production data is safe and he'll has documented retesting to cover his ass with. Who knows by the time he's done testing; maybe MySQL 4.0 will be declair production stable and his apps will be done and tested.
  • "Survey Says" *ding* (Score:2, Interesting)

    by Snowhare ( 263311 )
    This is a summary of how many 'hits' I found for selected terms and pairs of term from 12 Dec 2001 to early July via Google's groups search when I was comparing Postgres and MySQL to see which is more trouble to maintain. You can draw your own conclusions as to their relative quality as based on their 'complaints' percentages.

    postgres 17800 100 percent
    MySQL 248000 100 percent
    Postgres crash 358 2 percent
    MySQL crash 1930 0.7 percent
    Postgres corrupt 41 0.2 percent
    MySQL corrupt 510 0.2 percent
    Postgres slow 558 2.3 percent
    MySQL slow 2830 1.1 percent
    Postgres buggy 41 0.2 percent
    MySQL buggy 297 0.1 percent
    Postgres bugs 612 3 percent
    MySQL bugs 7540 3 percent
    Postgres problem 4520 25 percent
    MySQL problem 42200 17 percent
    Postgres hung 46 0.3 percent
    MySQL hung 222 0.1 percent
    Postgres happy 328 1.8 percent
    MySQL happy 1810 0.7 percent

    --
    Benjamin Franz

    Lameness filter encountered. Discussion aborted!
    Reason: Please use less 'lame' filters.
  • http://www.mysql.com/documentation/lists.html

    Here you will get few real answers to your question, and allot of chatter about which db you should be using.

  • 1) If you need UNION capability, you are likely starting to get into the advanced SQL area where MySQL starts to break. I would suggest checking out PostgreSQL, which will have support for a lot of these advanced features.

    2) The other alternative is to eat a little CPU and use a temporary table to get around the lack of UNION in v.3x. I've had to do this before when I was building an app using MySQL, got 90% done, and then realized I needed to do a UNION. To work around it, I did four separate queries into a temporary table, did my "union" query on the temp table, and then dropped the table. This creates the same result as UNION, but with a little more CPU overhead and a lot less elegance. But it beats either:
    a) Rewriting your app to use PostgreSQL.
    b) Taking a chance on a new and unproven version of MySQL.
  • Laurence Olivier(nazi):Is it stable? .. Is it stable?
    Dustin Hoffman(guy):You're talking to me?
    L.O.: Is it stable?
    D.H.: What stable?
    L.O.: Is it stable?
    D.H.: I don't know what you mean. I can't tell you something's stable or not, unless I know specifically what you're talking about.
    L.O.: Is it stable?
    D.H.: Tell me what "it" is first.
    L.O.: Is it stable?
    D.H.: Yes, it's stable, it's very stable, so stable you wouldn't believe it.
    L.O.: Is it stable?
    D.H.: No, it's not stable, it's very dangerous, be careful.

  • I've tried compiling MySQL version 4.0.2 on OpenBSD.

    First of all, to even get this thing compiled, you'll probably need to apply patches from the ports. See http://www.openbsd.org/cgi-bin/cvsweb/ports/databa ses/mysql/patches/ [openbsd.org] for OpenBSD ports patches.

    For example, I've needed patch-innobase_include_univ_i to compile any recent MySQL to compile on OpenBSD 3.1.
    That patch is quite funny:

    #define UNIV_INLINE __inline
    #else
    /* config.h contains the right def for 'inline' for the current compiler */
    -#if (__GNUC__ == 2)
    -#define UNIV_INLINE extern inline
    -#else
    -/* extern inline doesn't work with gcc 3.0.2 */
    +/* mysql people don't understand extern inline */
    #define UNIV_INLINE static inline

    When installing MySQL 4.0.2 I've applied all of those patches, and then configured, compiled and made make install.

    The database new MySQL daemon started up and operated fine (with previous version's data files), but mysql 4 client were unable to connect (I've got an "ERROR:" error message. Tells much, doesn't it?).

    So, to summarize, wait some more time, at least until they release a beta.

  • by vandan ( 151516 ) on Friday August 02, 2002 @10:48AM (#3998659) Homepage
    We (I) upgraded to MySQL-4.0.1 when it came out (after a little testing at home).
    I upgraded to MySQL-4.0.2 about 2 weeks ago.
    We have about 5 databases with 10 tables in each which have between 1,000 and 100,000 records per table. We have about 30 users connected to the MySQL server from an Access 2002 front-end. I have been moving stuff from SQL Server 7 as it bogs down. MySQL-4 seems to handle multiple connections better than SQL Server - update queries that used to timeout (and crash Access) when in SQL Server now run effortlessly.

    By the way, our little MySQL beast is an AMD K6-2 500 with 256MB, and is also running an IMAP server for about 50 mailboxes. Oh - and don't forget VNC ;)

    The ONLY problems I have had have been with the MyISAM table handler with large tables & multiple users. I was getting locks and time-outs, so I upgraded them to InnoDB, and have had no other problems since.

    I have also started using transactions (which InnoDB supports). Seems to work perfectly for me. Admittedly, I'm not doing anything major, but any ... no problems for me.

    Foreign Keys are also supported by InnoDB. Works well. MySQL-4.0.2 just made foreign key constraints survive an alter table command (4.0.1 used to dump the constraint).

    What else can I say? I've been very happy with MySQL-4.0.x. Certainly no crashes or anything unexpected. And the --log-update startup option gives you a nice running backup anyway...

    I would upgrade. I think the 'alpha' versioning is being too modest.
    • If you can make it through all the MySQL-haters rantings, (can somebody mod those guys down, it's off-topic!), here are my current conclusions after using mysql 4.0 in an industrial app (27 million records, about 1 million queries daily).

      1. It works good. No crashes and no more problems than the 3.23 versions.
      2. The replication still isn't there yet. If replication matters to you, wait.
      3. I agree it's not "alpha". It is no more or less buggy than the stable 3.23.51 version.

      I will be very happy when replication is working and tested and works on ALL queries and can recover from errors. Until then it's still a day of fooling around every time replication screws up.
  • I've been working on a fairly large database for analysis of on-line communities, using 4.0.2 and Python. It has about 6 million records, about 4 GB of data now, in about 20 tables. The only problem I've seen is a crash on W2K when I gave it too much memory (300 MB on a 500MB machine with too many other things running) for the key buffer.

    Every performance obstacle I encountered was fixable with temporary, tables, better SQL or use of various MySQL tweaks having to do with inserting and updating with locking.

    However, the one thing I can't speak to is multi-user access. I haven't had a bunch of people hitting it at the same time. The most I've done is to have a multi-threaded spider inserting about 2000 records a minute while I do other operations. No real performance problems there.

    BTW, I'm using myisam tables...

    Nick
  • by MattRog ( 527508 ) on Friday August 02, 2002 @11:37AM (#3999072)
    Let me repeat the same things I say every time:

    Why MySQL is Not Suitable for Enterprise or High-Volume Use
    or
    MySQL.com misleads you about it's capabilities

    Replication in MySQL is a joke for 'mission critical' use. As I understand it, the binary log records SQL modification statements which are executed on a master, not the data which was changed. This is involves significant assumptions beforehand, such that the master and slave(s) must be 100% identical. If I perform an UPDATE on the master, the changes are not replicated, but the query. This is what I would call the 'easy way out'. Who knows what happens to the query once it is replicated out - what if it hangs halfway through? I can't roll back and be in a consistent state, I have half-completed changes which makes my database inconsistent and now I'm forced to dump-and-load. Keep track of which rows are modified, to what from what, and ensure that those transactions are replicated to my slaves. Anything less is simply useless for high availability.

    I would also be willing to bet that a significant number of installations that have transitioned to MySQL replication are doing so due to table-lock induced latency. A suitable system with a capable RDBMS could probably handle all of the load given to it and not need 'many slaves' to handle the extra traffic. They would have a single failover for high availability and that's it.

    Filesystem buffered writes. Transactional support is great - it allows me to roll-back aborted transactions. However, due to the inability to control whether or not my tables are write-buffered means that MySQL may *think* it has performed a write even though it is still in the write-cache. I can then turn off the system and voila -- corruption! Part of the fault lies in the OS who tells MySQL it was written even though it is in the cache, but I have a simple solution. Devise a way to selectively turn off buffered writes for certain tables / databases. This way if I know I have a critical table which has a lot of writes I can turn buffering off and be ASSURED that writes will be performed when asked. I suspect a lot of 1040 and other table corruptions are caused by something like this. Yes, performance will take a hit but I think it is a very acceptable trade-off for data corruption. Obviously all system tables should NOT be buffered.

    Inability to use more than one index on a table in a query -- most enterprise RDBMS' can use more than one index on a table for a query. This can easily save a table scan or the use of a single, less-efficient index. Given an example query - 'SELECT bob FROM sometable WHERE somecol = 45 and somecol2
    Clustered indexes. These basically physically sort the table based on particular columns. This allows you to ORDER BY username ASC without using anything special since the rows are already sorted on username (if you have a users table and cluster the username col). This also greatly speeds up BETWEEN clauses. And yes, to people who know a little bit of SQL but don't know as much about clustered indexes -- you can create an index with a bobcol ASC but clustering the actual data is faster and more efficient if you are grabbing data which is not on the index. For example, SELECT * FROM table ORDER BY username ASC will not be as efficient as the same query clustered on the username. If you had a sorted index on username it will probably read the index sequentially and then visit the table. That extra operation = more disk seeks = more time / cpu to execute (and it really adds up as the table size increases). However, if you are doing something like 'select username, password from user order by username' it would be better to create a sorted index on username ASC, password. That way it will read the index only and not visit the table at all.

    On-line backups. In today's internet world your site has to be 24/7. This means you cannot have significant performance problems (or even offline-ing your dB!) when you make a dump -- Sybase, etc. have done this from as far back as I can remember. Postgres can do this with an add-on which is well worth the money. As far as I know MySQL can only do this with InnoDB tables and is a for-pay feature (since it has a MVC log to use in the meantime).

    Backups to something other than CSV files. MS SQL, Sybase, Oracle, they all dump to a compressed binary file. Saves a TON of space and is MUCH FASTER to dump and load. I can dump a 12GB Sybase DB in under 20 minutes. Loading it all (from scratch) and then bringing the DB online is about the same amount of time. MySQL stupidly logs the CREATE TABLE / INSERT statements. What does this mean? That I have to wait for 4 million INSERTs to be performed when loading my table, and FURTHER I have to wait for the INDEXES to be re-created on the new data. Dump the indexes, too! (Remember that full-text indexing is just another index, so if you use that and have to load from a dump be in store for SIGNIFICANT downtime).

    Ability to specify the number of files to dump to. What happens if you have a dump which is larger than 2GB? Some linux distros cannot handle a single file of 2GB or more without recompiling the kernel. Give users a way to, within the dump statement, split the dump over two files. Not only will that help avoid the 2GB limit, but it can speed up dump/loads since I can dump to a bunch of different disks to improve throughput. Sybase has the 'STRIPE ON' clause (originally to dump to two tape drives at once but works fine on filesystem files as well) to split the dump equally over an unlimited number of files. This also impacts the fact that MySQL tables and indexes are stored in filesystem files that are also subject to a 2GB limit.

    Cleaner way to view query plans of statements. EXPLAIN ... is great and all, but the resulting table is a PAIN to read. What I want to know is simple:
    Query is using XYZ, ABC tables. Table XYZ is using index 123 which is sorted so I do not need to create a temp table to sort ASC.
    Since you have all the columns in your select statement in the index I do not have to visit the actual table - I can pull it all from the index. Because of this, I will read the index from start to finish.
    ABC is using index 23dsf which is not sorted so I must create a temp table to sort that. Also, since it is a join, I do not need to perform an index scan but a positioned search (table scan is to a WHERE clause with no index AS index scan is to an index which is not selective enough or needs to read all columns.)
    Simple, easy and pretty much even a NOVICE can see that their query is a good performer or a bad performer.
    Along with more in-depth EXPLAIN, also provide me with a way to see what the optimizer is doing with the query. In MS SQL and Sybase you have 'trace flags' which you can turn on before your query to see EXACTLY what Sybase is doing - why does it think this index is better than this other one, why is it table scanning when you think it should index sort, etc. Give me an easy way to say 'verbose on; explain xxx;'.

    Ability to delve deeply into performance of the system. If there is one job a DBA must know it's how to tell what the heck is going on when something is slow. Currently MySQL gives you meaningless info like 'slow queries'. Great, I see 200,000 of them. What queries are they? What good is it in a large application which may contain 3000 lines of SQL to tell me the raw number of queries which are slow? I want to know the EXACT SQL of the query(s) which are slow and I want to find the one taking up the most CPU time and blocking all the rest. I want to know how MySQL is managing it's data cache so I can see if I need more ram (e.g. it is swapping lots of data to/from the cache) or if I am I/O bound. Don't tell me to look at 'free' or 'top' - half the time it is wrong because you (MySQL) tell it misleading figures. I want *you* to tell me exactly what you are doing since you would know best! If you've ever seen a sp_sysmon output from Sybase ASE you'd know what I'm talking about.

    MySQL's query optimizer is PISS POOR. If I see another changelog entry like this I'm going to scream:
    Optimized queries of type: SELECT DISTINCT * from table_name ORDER by key_part1 LIMIT #
    So does that mean these queries were NOT AT ALL optimized before? It doesn't read 'FURTHER optimized'.
    "ORDER BY ... DESC can now use keys."
    Does that mean it was table scanning each time? Jebus! Hands down the query optimizer is one of the most important things in the database -- knowing how to use the database statistics and knowing when to use a merge-join vs. a hash-join etc. are CRITIAL to database performance.

    Of course, the usuals: integrated row (or in the least page) locking, full support of subqueries, stored procedures, views, triggers, referential integrity, transactions, etc. etc. etc.'

    PostGRES and virtually 100% of 'for pay' RDBMs have this. There simply is no reason to use MySQL for anything sufficiently non-trivial.
    • Wow, a shining example of someone firmly planting their foot in their mouth on Slashdot. What a surprise. It's nice that the post was moderated up to 4 as ``Informative''... too bad most of the information was useless or wrong.

      The overarching problem in your comment was your opening statement:

      'Let me repeat the same things I say every time'

      The problem there, which is obvious to anyone remotely understanding of what active development means, is that MySQL is sort of a moving target. Your statements are erroneous is so many ways, but most of them can be boiled down to this: you are arguing against something that no longer exists. MySQL, as you attack it, is no more, and has been replaced by something far better. So let's just take some of your arguments (unlike you, I refuse to speak on those things that I *DON'T* know, so I'll skip a few with which I'm not familiar) and see how they stand up, shall we?

      Argument: Replication in MySQL is a joke for 'mission critical' use.
      Rebuttal: Somehow that fact doesn't impede Yahoo!'s extensive use of it. (See Jeremy Zawodny's presentations at the recently-held OSCON.) If the query hangs on the slave halfway through, it isn't marked on the slave as having completed. When the slave becomes available again, it notes its pointer in the transaction log and catches up automatically. Oh, and replication (at least in 4.x, possibly also in 3.23.x) is transaction-safe.

      Argument: Filesystem buffered writes.
      Rebuttal: As another poster wrote, leave the OS out of this. If you cannot properly configure your OS to not buffer writes, you probably shouldn't be running a 'mission critical' ANYTHING.

      Argument: On-line backups [are not there]
      Rebuttal: So set up a dedicated slave for backups. Turn off the slave while backups are running, it catches up when backups are done and it is brought back up. A *simple* solution to a *simple* problem. If you really feel the need to do a hot backup of your live server, you can check into using InnoDB's tool at http://www.innodb.com/hotbackup.html .

      Argument: Backups to something other than CSV files.
      Rebuttal: You mean like backing up the raw MyISAM files? Of course, that doesn't work with InnoDB databases, so you can use their hot backup tool for that as well, if this is a REAL (rather than IMAGINED) problem.

      Argument: I have to wait for 4 million INSERTs to be performed...
      Rebuttal: RTFM. No you don't.

      Argument: [No] Ability to specify the number of files to dump to
      Rebuttal: Again, is this a real or imagined problem? It's likely that whatever you are trying to do, there's a better way. Unfamiliarity with a particular tool usually results in this type of problem.

      Argument: Cleaner way to view query plans of statements
      Rebuttal: So because YOU don't like the output of EXPLAIN you're saying MySQL isn't ready for production? WTF are you talking about?! As for a more *in-depth* EXPLAIN, I agree there, and I found PostgreSQL's mechanism kind of cool. Of course, in four years of running MySQL in a production environment, I'm not sure I would have used it more than once or twice; MySQL's EXPLAIN has always been sufficient, if you actually know what you're doing.

      Argument: Ability to delve deeply into performance of the system ... Currently MySQL gives you meaningless info like 'slow queries'
      Rebuttal: RTFM. You are obviously unfamiliar with the slow queries log where MySQL gives you EXACTLY the information you are looking for. As for the data cache and whatnot, I don't know if that is actually available or not.

      Argument: MySQL's query optimizer is PISS POOR
      Rebuttal: And your evidence? Oh wait, you didn't actually provide any. You just brought up a tangential issue...

      Argument: If I see another changelog entry...
      Rebuttal: If you are that concerned, you have some good options here. (a) Pay the developers to hold your hand and explain to you what has happened. (b) Use the source and do your own friggin' diff. This is Unix; stop acting so helpless.

      Argument: [a laundry list of disinformation]
      Rebuttal: Dude, have you not even looked at MySQL since 3.21 or something? Row locking is available in InnoDB, as are transactions. Stored procedures and triggers are planned for 5.x IIRC, but so many applications DON'T need them that the MySQL folks simply haven't cared to add them. Ditto for views (which are also slated for 5.x).
    • Hey,

      Thanks for the critical feedback - however, you have some information that is not accurate.

      On the positive side, your criticism has provided some interesting ideas! :)

      REPLICATION
      You are correct that the binary log stores the SQL data modification statements that were applied to the master, rather than the actual
      changes that were made to it. You are also correct that if something goes wrong, the DBA is the one who gets to fix it.

      It does not assume that the master and slave are equal - it does assume that the slave contains an linear subset of the data on the
      master.

      We have users working with replication in high-demand situations and it is performing well. Could we improve it? Of course - I was just
      browsing through the slides from the PostgreSQL Replication talk at OSCON and it looks like some very cool things are going on - we should
      watch and learn. :)

      TABLE LOCK LATENCY
      It is true that table-level locking used by MyISAM performs poorly under heavy concurrent read/write.

      If this is an issue switch to the InnoDB storage engine (which uses low-cost, non-escalating row level locking) or the Berkley DB storage
      engine (which uses page-level locking).

      InnoDB uses a single bit to indicate if a particular page stores rows that are locked. If any rows are locked in the page, then a few more bits are needed for the page to indicate what particular rows are locked.

      FILE SYSTEM BUFFERING
      File system buffering can be a thorny issue. The InnoDB storage engine forces a flush to disk upon the commit of every transaction and
      then writes a checkpoint so that it knows when the last flush was made.

      INDEXING
      This is just plain wrong. Of course MySQL can use more than one index in a query!

      CLUSTERED INDEXES
      MyISAM tables can be optimized so that the order of the rows in the table matches the order of the indexes on the table.

      InnoDB tables already use clustered primary key indexes. Secondary indexes refer to the primary key values.

      ON-LINE BACKUPS
      Replicate the database out to another server (even one on the same machine), then stop the slave to take a backup.
      This has the added benefit of being able to ask the slave to take over from the master when you need to maintain the master.

      BACKUP FORMAT
      Use the binary log instead of the mysqldump tool - it uses a compressed binary format that is much more compact.

      Also, if you have to recreate a table from a mysqldump, then disable indexes until you have recreated all the rows - will save a good deal
      of time on bigger tables.

      Dumping the indexes is probably not a bad idea though. :)

      DUMPING TO MULTIPLE FILES
      An option to allow dumping to multiple files would be convenient. :)

      In the past, I just asked mysqldump to dump to stdout and have a perl script handle the segmenting.

      The binary log does get segmented into multiple files automatically. I will ask the developers if it would make sense to make a new dump tool that works with the binary log format so as to get the benefits of that format.

      BETTER TOOLS...
      Duly noted - the output from EXPLAIN is cryptic.

      DELVING DEEPLY...
      Absolutely - we could use more tools to give detailed performance information. The current tools that report the number of active threads,
      the number of questions run, the memory currently used, the max. memory consumed, etc. are not enough. We have some graphical tools like MySQL-Graph (A GPL'd app) to make review of the data easier.

      Also, slow queries is more than a counter. The slow query log stores details on every query that ran over the value of the long_query_time
      setting. Use the mysqldumpslow tool to give a summary of data in the log file. The log can also record queries that did not use an index.

      QUERY OPTIMIZATION
      On what knowledge do you base your assertion that the query optimizer is 'PISS POOR'? Do you understand the code behind it? Have you run
      benchmarks to compare its performance to another optimizer?

      Of course we keep optimizing for specific cases. We want to continue to improve performance whereever possible. We have spent a good deal
      of effort doing broad optimizations - the optimizations that have the greatest benefit for the most queries. Now we are work more on
      tweaking specific cases.

      MISSING FEATURES
      The Berkley DB storage engine uses page level locking.

      The InnoDB storage engine uses row level locking (without resorting to lock escalation :)

      We have excellent transaction support - likely the best of any available database today. InnoDB supports the repeatable read transaction
      isolation level. However, due to how we implemented our multi-versioning support, we don't get phantom reads. This is a higher level of transactional isolation than MS SQL, Sybase, PostgreSQL, Interbase, Ingres, etc. IIRC, only FireBird and Oracle may be the same.

      Sub-selects should be out very soon. We are still working on stored procedures, views, triggers and full support for referential
      integrity. We know that these features are important. However, we are working on doing truly robust implementations - rushing them out
      will not help anyone.

      END NOTES
      Why does no one mention the stuff that MySQL is good at? :)

      We are fast - we have third party confirmation that we are faster than DB2, MS SQL and Sybase. The test even confirmed that we perform about as well as Oracle (a bit slower :) when running under Windows using a JDBC driver.

      We don't need to stop the database to vacuum or do many maintainance tasks.

      We know that we can run in critical environments because we have users like Yahoo! Finance *and* Slashdot :) using us for critical, high-load applications.

      We are a fully-threaded app and can take full advantage of SMP machines.

      We can run natively under a bunch of OSs - including Windows.

      Our ability to use different storage engines gives users great choice in how to manage their data. If someone needs a lightweight format in a non-transactional environment, use MyISAM - it has very little storage overhead and is speedy in situtations where you do not have many concurrent reads/writes.

      If you need really robust transaction support that ensures the integrity of your data, use the InnoDB storage engine. Storage overhead is more than with MyISAM tables, but that is not generally an issue for enterprise level users.

      I can hear people grumbling - well, the transaction support isn't integrated, so it isn't valid... That is complete junk - since when is choice a bug? That is like saying that the Linux is not a modern operating system because its default filesystem does not use journaling. Usually, is it only the proprietary and/or less advanced operating systems do not give you a choice of file system.

      Also, we can easily add in new storage to support specific needs. Look at how quickly InnoDB was integrated - it suddenly took us from having no transaction support to having great transactional support. Without the storage engine concept, we would have had to do a lot more work to get it integrated.

      blah blah blah... :)
  • by Proudrooster ( 580120 ) on Friday August 02, 2002 @01:10PM (#3999708) Homepage
    Speaking as the emergency backup holographic DBA who has experience with both MySQL and other Commercial Databases particularaly Oracle, I can give you the following info.

    MySQL is small, fast and you can even use it with MS-Access with MyODBC

    The drawbacks to MySQL are limited SQL support e.g. (no subselects, no inline views, no stored procedures, and just you TRY to figure out the outerjoin syntax (geez) ), however if you are doing simple queries it's fine. If you want to do more advanced stuff and say have multiple cursors open at the same time you have to use an additional language like Perl with DBD/DBI.

    Also, MySQL does not have "read consistency", "row level locking", or the concept of a "transaction" (at least not last time I used it). If you do an insert/update it happens NOW, no need for that pesky SQL "commit".

    Again, on the plus side, generally speaking MySQL is FAST for queries! However, when you do hit a snag, it is harder to tune performance and optimize the layout of the database on the physical disks e.g. (You can't partition a table across multiple disks/filesystems and have to rely on RAID0 striping). Also, I don't think there is anything as replication so keeping a hot standby database for failover or disaster recovery can be tricky.

    The most important thing to keep in mind is this, "Use the right tool for the job". I still prefer any data I care about or, database that may affect my sleep be an Oracle database. However, replicating data from Oracle to a MySQL database, then using MySQL as the backend for query intensive web applications might make more sense e.g (Amazon-type, Slashdot-type). In this scenario, your data is tucked away securely in an Oracle database, but it feeds a bunch of lowcost, commodity beater boxes that can be quickly deployed to give lowcost scalability and more peace of mind against hacking.

    Weigh the importance of your data and "use the right tool for the job". It could be argued that the most valuable asset of a modern company is it's data.

    One of my favorite quotes which applies to this situation is: "When the only tool I have is a hammer, every job looks like a nail."

    Good Luck!

I have hardly ever known a mathematician who was capable of reasoning. -- Plato

Working...